Недавно я увидел более интересный вопрос интервью:
Как выполнить Promise последовательно?
Вот простой ответ для вас. Для нескольких методов Promise, изначально предоставляемыхall
а такжеrace
метод. Однако ни один из них не выполняется серийно. Что должно, если выполняется последовательный метод? Вот два способа написания:
рекурсивное выполнение
Проще говоря, следующий асинхронный метод пропускается рекурсивно в следующем способе:then(next())
function iteratorPromise(arr){
(function iter(){
if(arr.length)
arr.shift()().then(iter)
})()
}
let arr = [()=>{
return new Promise(res=>{
console.log("run", Date.now());
res()
})
},()=>{
return new Promise(res=>{
console.log("run", Date.now());
res()
})
},()=>{
return new Promise(res=>{
console.log("run", Date.now());
res()
})
}]
iteratorPromise(arr);
// output
run 1529918098567
run 1529918098568
run 1529918098569
циклический вызов
Этот подход сложен и использует Promise.resolve() напрямую. Через задание цикла получите окончательный результат.
function iteratorPromise(arr){
let res = Promise.resolve();
arr.forEach(fn=>{
res = res.then(()=>fn()) // 关键是 res=res.then... 这个逻辑
})
}
let arr = [()=>{
return new Promise(res=>{
setTimeout(()=>{
console.log("run", Date.now());
res()
},1000)
})
},()=>{
return new Promise(res=>{
setTimeout(()=>{
console.log("run", Date.now());
res()
},1000)
})
},()=>{
return new Promise(res=>{
setTimeout(()=>{
console.log("run", Date.now());
res()
},1000)
})
}]
iteratorPromise(arr);
// output
run 1529918643573
run 1529918644574
run 1529918645580