異步管理一直是前端開發的一個重點。
就多個promise的順序執行,總結了下面幾種方案。
使用回調的方案,也是最傳統的方案
const f1 = ()=>new Promise((resolve, reject)=>{
setTimeout(()=>{
console.log('p1 runing')
resolve(1)
}, 1000)
})
const f2 = ()=>new Promise((resolve, reject)=>{
setTimeout(()=>{
console.log('p2 runing')
resolve(2)
}, 1000)
})
// 使用回調形式
f1().then(()=>{
f2()
})
使用async、await的方案。
// 使用async await
async function asyncPromise(){
await f1()
f2()
}
使用reduce的方案,認為是最為優雅,但是最為難懂的。
const arr = [f1, f2]
const runPromiseInsequence = (array, value)=>array.reduce(
(promiseChain, currentFunction)=>promiseChain.then(currentFunction),
Promise.resolve(value)
)
runPromiseInsequence(arr, 'init')
使用遞歸的方案
// 使用遞歸 const arr = [f1, f2] function sequencePromise(arr){ const pro = arr.shift() if(pro) { pro().then(()=>{ sequencePromise(arr) }) } } sequencePromise(arr)
以上四種,后兩種可以不增加代碼的情況就可以直接順序執行多個promise。
而我把傳統的和最后一種作為母本方案:作為典型的解決方案。
這幾天一個心得:探索新的解決方案是很好的拓展知識的手段。主動的探索方法可以是多問幾個為什么,有什么好處,以及嘗試其它解決方案。針對方法可以考慮參數為Promise或函數。
