使用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()
。我不能在第一个.then()
中使用resolve(...)
。我想我可以这样做:
return Promise.all(promises).then(function(data){
// Do something with the data here
return data;
}).then(function(data){
// Do more stuff here
});
但这似乎不是正确的方法…正确的方法是什么?
但这似乎不是正确的方法…
这确实是正确的方法(或者至少是一个正确的方法)。这是承诺的一个关键方面,它们是一个管道,数据可以被管道中的各种处理程序处理。
的例子:
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
处理程序省略为简洁。在生产代码中,总是要么传播承诺,要么处理拒绝)
…因为第一个处理程序将两个承诺(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;
});
…但是如果它是异步的,你不会想要这样做,因为它最终会嵌套,嵌套很快就会失控。
今天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)
了解更多:
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
您的return data
方法是正确的,这是承诺链的一个例子。如果你从.then()
回调中返回一个承诺,JavaScript将解析该承诺并将数据传递给下一个then()
回调。
只是要小心,确保你处理错误与.catch()
。
Promise.all()
拒绝数组中的承诺。