0

У меня есть массив объектов. Для каждого объекта мне нужно вызвать асинхронную функцию, дождаться ее выполнения, а потом перейти к следующей итерации.

Делаю по мотивам этого ответа через async/await

async function process(data) {
  .........
  await asyncFunc({
    data: data,
    onfinished: function() {
      console.log("Finished");
    }
  });
}

async function loop() { const data = [1, 2, 3]; for (let i = 0; i < data.length; i++) { ...... console.log(data[i]) await process(data[i]); } }

И вижу в консоли

1
2
3
Finished
Finished
Finished

Чего не хватает для счастья?

Функция asyncFunc посылает аякс-запрос. Но она моя и изменить ее я не могу

  • 1
    Нормальная асинхронная функция, работающая с промисами не должна принимать коллбек onfinished как параметр. Надо смотреть ее исходники. Либо создавать свой промис и делать его выполненным уже внутри onfinished – Mike Feb 07 '21 at 15:15
  • @Mike Это не нормальная асинхронная функция, работающая с промисами. И принимает она именно коллбек – Anton Shchyrov Feb 07 '21 at 15:16
  • Тогда вам нужно писать обёртку вокруг этой функции с разрешением промиса изнутри колбека. – vsemozhebuty Feb 07 '21 at 15:20
  • @Mike ну вызову я внутри onfinished resolve. Я не соображу как мне по массиву пройтись синхронно, даже если process вернет промис – Anton Shchyrov Feb 07 '21 at 15:22
  • @vsemozhebuty Так .then() тоже ведь вернет промис. Как мне его вызов организовать для цикла? – Anton Shchyrov Feb 07 '21 at 15:23

1 Answers1

3

Как-то так?

function process(data) {
  // .........
  return new Promise((resolve) => {
    asyncFunc({
      data: data,
      onfinished: resolve,
    });
  });
}

async function loop() { const data = [1, 2, 3]; for (const item of data) { // ...... console.log(item) await process(item); console.log("Finished"); } }

vsemozhebuty
  • 14,042