只使用promise语法。不使用async、await等语法。
PS:网上广为流传的使用reduce实现多个promise串行执行只对同步promise生效。
function start(tasks){
var result = []
return tasks.reduce((accumulator,item,index)=>{
return item.then(res=>{
result[index] = res
return index == tasks.length - 1 ? result : item
})
},Promise.resolve())
}
start([
Promise.resolve(1),
Promise.resolve(2),
Promise.resolve(3)
]).then(res=>{
console.log(res) //[1,2,3]
})
串行执行成功
function start(tasks){
var result = []
return tasks.reduce((accumulator,item,index)=>{
return item.then(res=>{
result[index] = res
return index == tasks.length - 1 ? result : item
})
},Promise.resolve())
}
function delay(time){
return new Promise(function(resolve,reject){
setTimeout(function(){
resolve(time)
},time)
})
}
start([
delay(2000),
delay(2000),
delay(1000)
]).then(res=>{
console.log(res) //[undefined,undefined,1000]
})
串行执行不成功
reduce实现多个promise串行执行的关键在于不断的在accumulator后面追加then,你这里缺少了,应该改为