Для циклов asyn c await, promises - Javascript - PullRequest
2 голосов
/ 14 июля 2020

Я пытаюсь использовать for l oop для итерации по массиву и выполнения функции asyn c для каждого элемента. Я хочу, чтобы это происходило в последовательном порядке, и я не хочу, чтобы следующая функция asyn c для следующего элемента в массиве выполнялась до тех пор, пока функция asyn c для предыдущего элемента не будет ЗАВЕРШЕНА.

Я использую ожидание и обещания, чтобы попытаться сделать это. Однако я, должно быть, делаю что-то не так, потому что код работает неправильно. Для l oop кажется, что работает только один раз.

Вот мой код:

function asyncFunc(i)
{
  //Here I am updating my database which is the async part of this function
  return db.collection("collection").doc("doc").update({
  })
  
  .then(function(){  
      let d = new Date();
      console.log(i + " async COMPLETED at: " + d.getTime());
      return new Promise((resolve, reject) => {
        resolve;
      });
  });
}

async function doWork()
{
  var numbers = [1,2,3,4];
  for(const i of numbers)
  {
    var d = new Date();
    console.log(i + " async CALLED at: " + d.getTime());
    await asyncFunc(i);
  }
}

doWork();

Вот вывод консоли:

1 async CALLED at: 1594683980009
1 async COMPLETED at: 1594683980280

Почему это происходит?

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Для ясности в отношении реальной проблемы, с которой вы столкнулись, проблема связана с этим блоком вашего кода:

  return new Promise((resolve, reject) => {
    resolve;
  });

Проблема в том, что resolve должна быть функцией, которая фактически выполняет . Таким образом, вам было нужно следующее:

  return new Promise((resolve, reject) => {
    resolve();
  });
1 голос
/ 14 июля 2020

Итак, вы возвращаете два обещания, что является проблемой, потому что вы разрешаете одно только для создания второго, которого затем ожидает основной поток. Все, что вам нужно сделать, это вернуть обещание, которое дает вам db.collection ...

По сути, проблема в том, что новое обещание, которое вы создаете, не выполняется должным образом. Вы просто говорите, что обещание - это (resolve, reject) => {resolve;}, что А) даже не является функцией и Б) не будет разрешено. Потому что вы не вызывали функцию разрешения. На самом деле, это обещание никогда не должно было создаваться, потому что оно было совершенно ненужным, поэтому я бы больше беспокоился об обработке обещаний с простыми ожиданиями и возвратами, чем о создании их. TL; DR Не создавайте обещание, если уже существует обещание, которое вы можете использовать.

Этот код должен работать:

function asyncFunc(i)
{
  //Here I am updating my database which is the async part of this function
  return db.collection("collection").doc("doc").update({
  })
  .then(() =>{  
      let d = new Date();
      console.log(i + " async COMPLETED at: " + d.getTime());
  });
}

async function doWork()
{
  var numbers = [1,2,3,4];
  for(const i of numbers)
  {
    var d = new Date();
    console.log(i + " async CALLED at: " + d.getTime());
    await asyncFunc(i);
  }
}

doWork();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...