方法一:使用 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。