实现一个任务队列

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())
}