这次碰到了一个需求,需要列表中的每一项按顺序执行一个异步任务,看到这个需求,很多人会忽略按顺序,从而直接使用promise.all进行同步控制。 完成这个,第一个想法就是generator函数,挨个去next,这个其实是可以的,但是要自己写一个,又麻烦,那async? 试试看
async function yb(item){
console.log('async item start', item);
const res = await new Promise((rev)=>rev(item))
console.log('async item result', res);
return res
}
async function allDo (list){
list.forEach(async(item, index)=>{
await yb(index)
})
console.log('完成')
}
结果是,所有start按顺序打印结束后,打印完成,再按顺序打印result 明显,forEach把所有的方法都一次性全都遍历和执行了。并没有等上一个执行完成后,再执行下一个,我个人觉得这是async的问题 那么如果是for in和for of还有for循环呢,
async function yb(item){
console.log('async item start', item);
const res = await new Promise((rev)=>rev(item))
console.log('async item result', res);
return res
}
async function allDo (list){
for(let i in list){
await yb(i)
}
console.log('完成')
}
结果就很顺利了,start和result交替打印。最后打印完成,完美符合 这是为什么呢,按照一些博客的说法,这是因为for循环内部带了generator的执行,也就是上面我们提出的迭代器方法,他本身就用了迭代器的执行方案,所以能够奏效。 但是我觉得,没那么简单,作用域是有一定问题吧,毕竟能在for循环体里面直接使用awit方法, 不需要再定制一个async函数,所以我觉得问题更多出在函数域上面,但是不好考究。