Nodejs: Promise.all не вызывает ни один из моих асинхронных методов - PullRequest
0 голосов
/ 30 сентября 2019

Я очень запутан в обещании. Все, у меня есть несколько методов, подобных этому:

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 голосов
/ 30 сентября 2019

Promise.all получает массив Promise с, но вы передаете ему не Promise с, а некоторое объявление асинхронной функции. Вы должны запускать эти функции, когда передаете их Promise.all.

, что эквивалентно следующему:

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

Конечно, ваши push функции также кажутся неправильными! его цикл выполняется только для i=0, потому что он возвращается до того, как цикл повторяется для других i значений.

0 голосов
/ 30 сентября 2019

Ваша проблема в том, что вы немедленно return ваш первый Обещание. Ваша push функция возвращает только одно Обещание.

В следующем примере у нас есть функция, которая возвращает Массив неразрешенных Обещаний. Их можно ожидать с 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);
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...