节点:处理二维数组的承诺

Node: Process a 2D array of promises

我有一个二维数组 (2 X n) 的承诺,我想先处理第 1 行中的所有承诺,然后处理第 2 行中的所有承诺。

换句话说,我想在另一组 promise 完成执行后链接一组 promise。

我怎样才能做到这一点?

我尝试了以下方法,但它不起作用。有什么想法吗?

 Promise.resolve()
    .then(createPromises)//generates topPromises= [ [p1, p2, p3], [p4,p5,p6]]
    .then(function(topPromises){
      Promise.all(topPromises[0])
      .then(Promise.all[topPromises[1])
    })

您可以使用一点点 pseudo-recursion 来解决这个问题。

本质上,您有一个函数可以完成一组承诺。完成后,您再次调用相同的函数,但使用下一组。

let promiseCount = 1;
function create() {
  let n = promiseCount++;
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log(n);
      resolve();
    }, 500 * n);
  });
}

let groups = [
  [create(), create(), create()],
  [create(), create(), create()],
  [create(), create(), create()]
];

(function runGroup(i) {
  if (i < groups.length) {
    Promise.all(groups[i])
      .then(() => {
        console.log('Group', i + 1, 'complete');
        runGroup(i + 1);
      });
  }
})(0);

您错过了 return,并且您在 .then

之一中传递了 Promise 而不是 function
 Promise.resolve()
.then(createPromises)//generates topPromises= [ [p1, p2, p3], [p4,p5,p6]]
.then(function(topPromises){
  return Promise.all(topPromises[0])
  .then(() => Promise.all[topPromises[1]))
})

我不知道你到底需要什么,但你的代码可能看起来像这样:

cratePromises().reduce((topPromise, nestedPromises) => {
  return topPromise.then(data => {
    // data is empty array on first iteration and array of nestedPromises values on next iterations
    return Promise.all(nestedPromises)
  })
}, Promise.resolve([]))