Promise.all()。然后()解决?

时间:2015-10-12 04:53:55

标签: 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
});

但我不确定如何将数据传输到第二个.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
});

但这似乎不是正确的做法......对此有什么正确的方法?

3 个答案:

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




...但是如果它是异步的,你就不会想要这样做,因为它最终会被嵌套,并且嵌套很快就会失控。

答案 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)

了解详情: