使用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
});
但我不确定如何将数据传输到第二个.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
});
但这似乎不是正确的做法......对此有什么正确的方法?
答案 0 :(得分:121)
但这似乎不是正确的做法..
这确实是做到这一点的正确方法(或者至少是 正确的方法)。这是承诺的一个关键方面,它们是一个管道,数据可以由管道中的各种处理程序进行按摩。
示例:
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);
});

(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;
});

...但是如果它是异步的,你就不会想要这样做,因为它最终会被嵌套,并且嵌套很快就会失控。
答案 1 :(得分:2)
您的return data
方法是正确的,这是promise chaining的一个示例。如果您从.then()
回调中返回一个承诺,则JavaScript将解析该承诺并将数据传递给下一个then()
回调。
请小心,并确保使用.catch()
处理错误。 Promise.all()
rejects as soon as one of the promises in the array rejects。
答案 2 :(得分:1)
如今,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)
了解详情: