等到所有诺言完成

时间:2019-06-25 12:39:36

标签: node.js

我怎么知道何时for循环中的所有promise完成执行?有更好的方法吗?

for (let index = 0; index < array.length; index++) {
  request(array[index], function (error, response, body) {
    promise1().then(result1 => {
      if (result1 !== 0) {
        promise2().then(result2 => {
          promise3(result2);
        }
      } else {
        promise3(result1);
      }
    });
  });
}

console.log('all promises finished');

2 个答案:

答案 0 :(得分:2)

通过将代码转换为使用async / await将项目映射到承诺中,然后使用标准的Promise.all()函数来等待所有承诺得以解决,这变得更加容易:

// promisified request()
const requestP = item =>
  new Promise((resolve, reject) => {
    request(item, (error, response, body) => {
      if (error) return reject(error);
      resolve({ response, body });
    });
  });

const processItem = async item => {
  const { response, body } = await requestP(item);
  const result1 = await promise1(/* this probably uses response or body? */);
  if (result1 !== 0) {
    const result2 = await promise2();
    return await promise3(result2);
  } else {
    return await promise3(result1);
  }
};

const promises = array.map(processItem);

Promise.all(promises).then(() => {
  console.log("all promises finished");
});

答案 1 :(得分:2)

您可以继续在promises内的列表中添加创建的for loop

完成循环后,您可以注册Promise.all方法。

let list_of_promises = [];

for(...) {
    list_of_promises.push(
        new Promise(function(resolve, reject)) {
            ...
        }
    )
}

Promise.all(list_of_promises).then(function(data)) {
    ...
}.catch(function(err) {
    ...
});

如果您所有的promises得到解决,则将调用.then方法。

注意:即使您的一个诺言失败,它也会进入.catch方法内部。