Promise.all().then() resolve?



使用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,20]之前

…因为第一个处理程序将两个承诺(12)的解析作为一个数组,然后创建一个新数组,其中每个承诺乘以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()拒绝数组中的承诺。

最新更新