首页 > 解决方案 > 等待异步函数的循环

问题描述

我需要同步运行 startFunc 函数并在 for 循环中“等待”以完成任务,然后再次运行它。我不能在 startFunc() 中使用 await。我在 c# 中需要类似 .wait() 的东西,除了结果:start 1 end 1 start 2 end 2 etc...

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

标签: javascriptasynchronousasync-awaitwait

解决方案


您还需要将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并不断传递最后一个 Promise 作为累加器,而不是分配给外部变量:

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


推荐阅读