1.promise实现任务队列
- promise.then如果遇到没有返回值,那么默认就会把undefined包装成promise后返回,然后继续向下执行
- 我们在返回值里 返回一个新的promise,那么第一层的promise就会等到这内部的promise执行完毕后才会返回
- 而内部的promise什么时候执行完成,就依赖于resolve何时执行,这就达到了任务队列的目的
1. forEach版本
function taskQueue(arr){
let promise = Promise.resolve();
arr.forEach(item=>{
//这里需要把返回的Promise实例赋给promise,生成新的队列
promise = promise.then(()=>{
return new Promise(resolve=>{
// do...
setTimeout(()=>{
console.log(item)
resolve();
},2000)
})
})
})
}
2. reduce版本
function taskQueue(arr){
/**
* reduce方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终返回一个值
* reduce中callback的返回值会作为下一次的初始值
reduce参数
* callback,回调函数
* initialValue,初始传入值值
callback参数
* 1.previousValue,上一次调用回调返回的值,或者是提供的初始值
* 2.currentValue,数组中当前被处理的元素
* 3.index,当前元素在数组中的索引
* 4.array,reduce调用的数组
*/
arr.reduce((promise,item,index,array)=>{
return promise.then(()=>{
return new Promise(resolve=>{
setTimeout(()=>{
console.log(item)
resolve();
},2000)
})
})
},Promise.resolve())
}