Node.js:Promise.all没有调用我的任何异步方法

时间:2019-09-30 12:01:39

标签: node.js multithreading promise

我对promise很困惑。所有,我都有很多这样的方法:

const push = async () => {
    for (var i = 0; i < 2000; i++) {
        return new Promise(invoke => {
            client.publish(topic, message, pushOptions); // is mqtt client
            invoke(true);
        });
    }
};
const example2 = async () => {
    console.log('example2 started');
    await push();
    await push();
    await push();
    await push();
    await push();
};  ....

现在,我想通过全部承诺运行所有方法:

var syncList = [];
syncList.push(
    example2, example3, example4);
           Promise.all(syncList)
                .then((result) => {
                    console.log(result);
                }).catch(err => {
                    console.log(err);
                });

但是没有方法启动,我在终端上得到了这个登录信息:

[ [AsyncFunction: example2], 
  [AsyncFunction: example3], 
  [AsyncFunction: example4] ]

为什么我的方法没有运行?

2 个答案:

答案 0 :(得分:0)

您的问题是,您立即return {strong>第一承诺。您的push函数仅返回一个Promise。

在下面的示例中,我们有一个函数返回一个未解决的承诺数组。 Promise.all()

可以等待他们
const getPromiseArray = () => {
  console.log('start collecting tasks');
  const allPromises = [];
  for (var i = 0; i < 10; i++) {
    const newTask = new Promise(function(invoke) {
      const taskNr = i;
      setTimeout(() => { // some long operation
        console.log("task " + taskNr);
        invoke();
      }, 400);
    });
    allPromises.push(newTask);
  }

  console.log('end collecting tasks\n');
  return allPromises;
};


(async () => {
  const promisesArray = getPromiseArray();
  await Promise.all(promisesArray);
})();

答案 1 :(得分:0)

Promise.all得到一个Promise数组,但是传递给它的不是Promise,而是一些异步函数声明。 将它们传递给Promise.all时应运行这些函数。

与此等效的东西:

Promise.all([example2(), example3(), example4()])

当然,您的push函数似乎也是错误的!其循环仅针对i=0运行,因为它在循环迭代其他i值之前返回。