如何顺序执行10个异步任务?


方法一:使用 async/await 和 for 循环

这种方法使用 async/await 和 for 循环,每次只执行一个异步任务,并等待其完成后再执行下一个任务。

const sleep = (delay) => {
  return new Promise((resolve, reject) => {
    setTimeout((_) => resolve(), delay)
  })
}

async function doAsyncTask(taskNumber) {
  // 在这里写异步任务的代码
  console.log(`开始执行任务${taskNumber}`)
  await sleep(1000)
  console.log(`任务${taskNumber}执行完毕`)
}
async function runTasks() {
  for (let i = 1; i <= 10; i++) {
    await doAsyncTask(i)
  }
}

方法二:使用 Promise 和 reduce 方法

这种方法使用 Promise 和 reduce 方法,将每个异步任务包装成 Promise 实例,并使用 reduce 方法依次执行每个 Promise。

const sleep = (delay) => {
  return new Promise((resolve, reject) => {
    setTimeout((_) => resolve(), delay)
  })
}

const task = (i) => {
  return new Promise(async (resolve, reject) => {
    await sleep(500)
    console.log(`now is ${i}`)
    ++i
    resolve(i)
  })
}

;[task, task, task, task].reduce(async (prev, task) => {
  const res = await prev
  return task(res)
}, 0)

可以这样理解 prev 和 task:

  • prev:前一个 异步任务(promise)
  • task:当前的异步任务

当前的异步任务需要上一个异步任务的结果作参数,故很显然要 await prev。


文章作者: 高红翔
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 高红翔 !
  目录