在异步编程中,当某些任务失败时,处理 Promise 可能会带来挑战。让我们考虑以下场景:
const arr = [fetch('index.html'), fetch('http://does-not-exist')]; Promise.all(arr) .then(res => console.log('success', res)) .catch(err => console.log('error', err)); // This is executed
上面的代码使用 fetch 发出网络请求。然而,由于 Promise.all 会在第一个失败的请求时拒绝,我们遇到了一个问题:我们如何处理所有任务的结果,甚至是那些失败的任务?
To为了解决这个问题,我们可以采用以下原生 JavaScript 技术:
const reflect = p => p.then(v => ({ v, status: "fulfilled" }), e => ({ e, status: "rejected" }));
此反射函数返回一个新的 Promise,该 Promise 解析为包含解析值或拒绝原因的对象,以及指示 Promise 状态的状态属性。
var arr = [fetch('index.html'), fetch('http://does-not-exist')]; Promise.all(arr.map(reflect)).then(function(results){ var success = results.filter(x => x.status === "fulfilled"); });
在此示例中,我们将 Reflect 应用于数组中的每个 Promise。生成的数组现在包含每个请求的具有状态和错误或值属性的对象。
对于现代解决方案,请考虑使用内置的 Promise.allSettled :
Promise.allSettled([promise]).then(([result]) => { // Code will execute regardless of the promise's state // { status: "fulfilled", value: 33 } });
此方法提供了一种便捷的方法来处理所有已解决的承诺,无论它们如何
通过利用这些技术,您可以优雅地管理异步操作并访问所有承诺的结果,甚至是那些失败的结果,从而使您能够根据可用数据做出明智的决策。
以上是如何在异步 JavaScript 中处理所有 Promise,包括被拒绝的 Promise?的详细内容。更多信息请关注PHP中文网其他相关文章!