Jak*_*son 81 javascript node.js promise
使用Node 4.x. 当你有一个Promise.all(promises).then()什么是解决数据并将其传递给下一个数据的正确方法.then()?
我想做这样的事情:
Promise.all(promises).then(function(data){
// Do something with the data here
}).then(function(data){
// Do more stuff here
});
Run Code Online (Sandbox Code Playgroud)
但我不知道如何将数据提升到第二位.then().我不能resolve(...)在第一次使用.then().我发现我可以这样做:
return Promise.all(promises).then(function(data){
// Do something with the data here
return data;
}).then(function(data){
// Do more stuff here
});
Run Code Online (Sandbox Code Playgroud)
但这似乎不是正确的方法......对此有什么正确的方法?
T.J*_*der 129
但这似乎不是正确的方法..
这确实是做到这一点的正确方法(或者至少是一种正确的方式).这是promises的一个关键方面,它们是一个管道,数据可以由管道中的各种处理程序进行按摩.
例:
const promises = [
new Promise(resolve => setTimeout(resolve, 0, 1)),
new Promise(resolve => setTimeout(resolve, 0, 2))
];
Promise.all(promises)
.then(data => {
console.log("First handler", data);
return data.map(entry => entry * 10);
})
.then(data => {
console.log("Second handler", data);
});Run Code Online (Sandbox Code Playgroud)
(catch为简洁起见省略了处理程序.在生产代码中,始终要么传播承诺,要么处理拒绝.)
我们从中看到的输出是:
First handler [1,2] Second handler [10,20]
...因为第一个处理程序将两个promise(1和2)的分辨率作为一个数组获得,然后创建一个新数组,每个数组乘以10并返回它.第二个处理程序获取第一个返回的处理程序.
如果您正在进行的其他工作是同步的,您也可以将它放在第一个处理程序中:
例:
const promises = [
new Promise(resolve => setTimeout(resolve, 0, 1)),
new Promise(resolve => setTimeout(resolve, 0, 2))
];
Promise.all(promises)
.then(data => {
console.log("Initial data", data);
data = data.map(entry => entry * 10);
console.log("Updated data", data);
return data;
});Run Code Online (Sandbox Code Playgroud)
...但是如果它是异步的,你不会想要这样做,因为它最终会嵌套,并且嵌套很快就会失控.
如今 NodeJS 支持新async/await语法。这是一个简单的语法,让生活变得更轻松
async function process(promises) { // must be an async function
let x = await Promise.all(promises); // now x will be an array
x = x.map( tmp => tmp * 10); // proccessing the data.
}
const promises = [
new Promise(resolve => setTimeout(resolve, 0, 1)),
new Promise(resolve => setTimeout(resolve, 0, 2))
];
process(promises)
Run Code Online (Sandbox Code Playgroud)
了解更多:
| 归档时间: |
|
| 查看次数: |
144247 次 |
| 最近记录: |