题目说明
- 请实现一个队列处理程序,当传入任务队列时,能够串行地处理完任务,
- 如果传入的任务包含异步执行,那么必须确保异步执行完毕之后才会执行后面的任务。
function queue(list){
}
function task1(next){
setTimeout(function(){
console.log(1);
next();
}, 1000)
}
function task2(next){
console.log(2)
next();
}
function task3(next){
setTimeout(function(){
console.log(3);
next();
}, 200)
}
queue([task1, task2, task3])
解法一:Promise
function queue(list) {
list.reduce(
(p, cur) => p.then(() => new Promise((resolve) => cur(resolve))),
Promise.resolve()
)
}
- 利用reduce迭代队列,初始化一个成功的Promise对象,将resolve函数作为参数传入队列函数中,因此,当输出1后,执行
resolve()
时 ,Promise状态才改变,此时p替代。
解法二:async
async function queue(list) {
for (let index = 0; index < list.length; index++) {
const element = list[index]
await makePromise(element)
}
}
function makePromise(fn) {
return new Promise((resolve) => {
fn(resolve)
})
}
解法三:递归
function queue(list) {
list= [...list]
const step = () => {
const run = list.shift()
if (run) {
run(step)
}
}
step()
}