考虑这样的场景:您有一个值数组(例如,myArray)并且需要执行一个 Promise-顺序地基于函数(例如 myPromise),将每个数组元素作为参数传递。如何实现一个“可暂停循环”来确保 Promise 以正确的顺序得到解决?
要实现顺序执行,可以使用 Promise 链的组合和迭代处理。下面的代码片段演示了如何做到这一点:
myArray.reduce( (p, x) => p.then(() => myPromise(x)), Promise.resolve() )
这种方法利用reduce方法来迭代数组并创建一系列链式promise。每个 Promise 在前一个 Promise 完成后得到解决,有效地强制执行所需的执行顺序。
如果您支持异步函数,可以使用 forEachSeries 获得更清晰的解决方案函数:
const forEachSeries = async (iterable, action) => { for (const x of iterable) { await action(x) } } forEachSeries(myArray, myPromise)
此函数迭代数组并在每个元素处暂停,等待 Promise 得到解析,然后再继续下一次迭代。
如果需要将promise的返回值收集到一个数组中,可以修改forEachSeries函数如下:
const mapSeries = async (iterable, fn) => { const results = [] for (const x of iterable) { results.push(await fn(x)) } return results }
该函数迭代数组,将promise的结果累加到results数组中,最后返回收集到的结果。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3