Для циклов, ожидания и обещаний - Javascript - PullRequest
0 голосов
/ 14 июля 2020

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

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

function asyncFunc(i)
{
  //Here I am updating my database which is the async part of this function
  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: 1594674023549
2 async CALLED at: 1594674023556
3 async CALLED at: 1594674023556
4 async CALLED at: 1594674023557
1 async COMPLETED at: 1594674023852
2 async COMPLETED at: 1594674023943
3 async COMPLETED at: 1594674024033
4 async COMPLETED at: 1594674024140

Что я делаете что-то неправильно?

1 Ответ

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

Вы должны вернуть обещание в asyncFunc, чтобы ключевое слово await ожидало разрешения. Так что измените его на это:

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();
      });
  });
}
...