在等待为异步函数循环

问题描述 投票:1回答:1

我需要同步运行startFunc功能,并在for循环来完成任务,再次运行“等待”。我不能在startFunc使用的await()。我需要在C#我像.wait(),除了结果:开始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);
}
javascript asynchronous async-await wait
1个回答
2
投票

你需要把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);
  }
})();

另一种方法是不断链.thens:

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()
  );
© www.soinside.com 2019 - 2024. All rights reserved.