И така, най-накрая сте в ситуация, в която искате да направите асинхронна задача в последователност вътре в цикъл и искате да изчакате асинхронната задача да завърши своя процес и след това да преминете към следващия елемент в списъка... нали?

Страхотен! Тогава сте на правилната страница.

Да приемем, че имаме масив [1, 2, 3]

let myitems = [1, 2, 3];

И да предположим, че трябва да извикаме една асинхронна функция за всеки елемент, която отнема 3 секунди за обработка и отговор.

Така че за това нека създадем една функция за забавяне с setTimeout, която ще извикаме в нашата асинхронна функция, за да създадем известно забавяне в отговора.

function delay(){
   return new Promise(){ resolve => setTimeout(resolve, 3000)
}

След това ще напишем нашата асинхронна функция с помощта на async-await и ще я наречем itemRunner.

async function itemRunner(item){
    await delay();
    console.log(item);
}

Сега, ако се опитате да използвате for цикъл в myitemsмасив и извикате itemRunner, той няма да изчака отговора на itemRunners. Той просто ще извика и ще премине към следващия път и ще отпечата 1,2,3 в конзолата след три секунди.

Но ние не искаме това. Искаме да обработим масива последователно и да изчакаме текущият елемент да завърши процеса си и след това да преминем към следващия елемент. За да постигнем това, ще трябва да обвием for..loopвътре във функцияasyncи след това можем да използваме awaitкоето ще постави на пауза нашата цикъл и изчакайте обещанието да се разреши. След като обещанието бъде разрешено, то ще премине към следващия елемент.

async function processTasks(array) {
  array.forEach(async (item) => {
    await itemRunner(item);
  })
  console.log('Completed!!!');
}

Горната функция ще отпечата всеки елемент след интервал от 3 секунди.

ето пълния кодов фрагмент..

let myitems = [1, 2, 3];
function delay(){
   return new Promise(){ resolve => setTimeout(resolve, 3000)
}
/* you actual processing function */
async function itemRunner(item){
    await delay();
    console.log(item);
}
/* here is how you can wait in loop */
async function processTasks(array) {
  array.forEach(async (item) => {
    await itemRunner(item);
  })
  console.log('Completed!!!');
}
processTasks(myitems);

Това е всичко!

Дано помогне. Благодаря за четенето.