使用陣列迭代透過Promise 順序傳遞參數
考慮下列任務:
var myArray = [1 , 2, 3, 4, 5, 6]<p>function myPromise(num){<br> return new Promise(res => {</p><pre class="brush:php;toolbar:false">window.setTimeout(()=>{ res( console.log("done: " + num) ) },2000)
})
}
}
}
}
}
}
}
}
}
}}}
myPromise(myArray[0]).then(x => myPromise(myArray[1]))
.then(x => myPromise(myArray[2]) ). then(x => myPromise(myArray[3])) .then(x => myPromise(myArray[4])) .then(x => myPromise(myArray) [5]))
myArray.reduce( (p, x) => p.then(() => myPromise(x)), Promise.resolve() )
像上面這樣的程式碼將順序執行Promise。然而,如果陣列是動態填充的,為每個成員執行 myPromise() 就變得具有挑戰性。
有Promises 的可暫停迭代
const forEachSeries = async (iterable, action) => { for (const x of iterable) { await action(x) } } forEachSeries(myArray, myPromise)
折疊方法
此方法創建與數組元素一樣多的Promise,但如果這是可以接受的。
const mapSeries = async (iterable, fn) => { const results = [] for (const x of iterable) { results.push(await fn(x)) } return results }
非同步函數方法
const mapSeries = (iterable, fn) => { const iterator = iterable[Symbol.iterator]() const results = [] const go = () => { const {value, done} = iterator.next() if (done) { return results } return fn(value).then(mapped => { results.push(mapped) return go() }) } return Promise.resolve().then(go) }
非同步函數提供了更具可讀性和記憶體效率的解決方案。
收集回傳值
const myArray = [1, 2, 3, 4, 5, 6] const sleep = ms => new Promise(res => { setTimeout(res, ms) }) const myPromise = num => sleep(500).then(() => { console.log('done: ' + num) }) const forEachSeries = async (iterable, action) => { for (const x of iterable) { await action(x) } } forEachSeries(myArray, myPromise) .then(() => { console.log('all done!') })
以上是如何使用數組迭代透過 Promise 順序傳遞參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!