Ожидание циклов для асинхронной функции - PullRequest
0 голосов
/ 08 февраля 2019

Мне нужно запустить функцию startFunc синхронно и подождать, пока цикл завершит задачу и снова запустит ее.Я не могу использовать await в startFunc ().Мне нужно что-то вроде .wait () в C # I, кроме результата: начало 1 конец 1 начало 2 конец 2 и т. Д ...

function callToDB(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
async function startFunc (i) {
  console.log('start', i);
  await callToDB(1000);
  console.log('end', i);
}

for (let i = 0; i < 5; i++) {
  startFunc(i);
}

1 Ответ

0 голосов
/ 08 февраля 2019

Вам также необходимо поместить цикл for в функцию async, чтобы вы могли await каждый вызов startFunc:

function callToDB(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
async function startFunc (i) {
  console.log('start', i);
  await callToDB(1000);
  console.log('end', i);
}

(async () => {
  for (let i = 0; i < 5; i++) {
    await startFunc(i);
  }
})();

Другим методом будет непрерывное связывание .then s:

function callToDB(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
async function startFunc (i) {
  console.log('start', i);
  await callToDB(1000);
  console.log('end', i);
}

let prom = Promise.resolve();
for (let i = 0; i < 5; i++) {
  prom = prom.then(() => startFunc(i));
}

Или вы можете использовать .reduce и постоянно передавать последнее Обещание в качестве аккумулятора, а не назначать внешнюю переменную:

function callToDB(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
async function startFunc (i) {
  console.log('start', i);
  await callToDB(1000);
  console.log('end', i);
}

const finalProm = Array.from({ length: 5 })
  .reduce(
    (lastProm, _, i) => lastProm.then(() => startFunc(i)),
    Promise.resolve()
  );
...