【发布时间】:2018-11-24 20:12:53
【问题描述】:
我正在尝试找到一种通用方法来处理承诺链上的错误。在下面的片段中,我想直接在我的 connection.js 中处理潜在的连接错误。
connection.js
function getData() {
return fetch(myEndpoint)
.catch(err => handleConnectionError(err)) // redirect to error page or similar
}
app.js
// import connection
connection.getData()
.then(data => handleData(data.foo))
所以这个场景有两种表现方式:
- 如果我在 connection.js 中发现错误而不抛出新错误,它将继续承诺链并且 handleData() 将失败
- 如果我在处理后再次抛出错误,Promise 链将不会继续执行,但随后我在控制台中出现未处理的承诺拒绝错误。
那么实际上没有比每次在我的应用程序某处使用 getData() 函数时捕获和处理错误更好的方法了吗?
【问题讨论】:
-
您在寻找这样的东西吗? stackoverflow.com/questions/31424561/…
.then(({ data }) => { if (data) handleData(data.foo); ...或者如果没有data,可以早点使用await和return -
这可能比我每次使用连接时实际处理错误更糟糕。但遗憾的是,这只是证实,没有更优雅的本地方式来处理这个问题。 :-/
-
const { data } = await connection.getData(); if (!data) return;看起来相当干净 IMO,但不幸的是你必须在getData的所有消费者中使用它,我想知道是否有更好的方法 -
我有一个想法,如果你不喜欢
await/return,使用回调你可以调用.thenon。它看起来很奇怪,但它减少了重复的捕获代码jsfiddle.net/m0wheoa1 -
你可以在getData中返回一个新的promise,如果有错误就拒绝它。这应该会停止执行,同时不会冒出任何错误,尽管它还需要一些额外的工作。不确定您对本地人的定义是否可以接受。
标签: javascript