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

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(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;
  });
Run Code Online (Sandbox Code Playgroud)

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

  • @JakeWilson:这些是不同的问题.但是你混淆了两件事:*创造*并解决承诺,以及*处理*承诺.在创建和解决承诺时,使用`resolve`和`reject`.当你处理*时,如果你的处理失败,你确实会抛出异常来触发失败路径.是的,您也可以从原始的`Promise`回调中抛出异常(而不是使用`reject`),但并非所有失败都是例外. (6认同)

Ami*_*ein 5

如今 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)

了解更多: