在承诺链的早期处理错误

时间:2018-11-24 07:48:51

标签: javascript

我正在尝试找到一种处理诺言链上错误的一般方法。在下面的片段中,我想直接在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()函数时,没有比捕获和处理错误更好的方法了吗?

2 个答案:

答案 0 :(得分:0)

执行此操作的最佳方法是进行最后的处理以解决所有错误。例如:

function errorHandler(e) {
    if (e instanceof x) {
        //handle here
    }
}

然后:

fetch(endPoint).then(doSomething).then(doAnotherThing).catch(err => errorHandler(err))

如果沿链中的访存或任何其他承诺产生错误,那么其余的then()语句将被跳过,并由最终的catch函数捕获。从那里开始,您需要确保处理所有诺言可能引发的所有类型的错误。

但是,您将需要摆脱getData中的问题,因为由于已解决了错误,它将导致链的其余部分照常运行。

希望有帮助

答案 1 :(得分:0)

  

因此,除了我每次在应用程序中的某个位置使用getData()函数时捕获并处理错误之外,实际上没有更好的方法了吗?

是的,这正是您应该做的:

function getData() {
  return fetch(myEndpoint)
}

// elsewhere:
connection.getData().then(handleData, handleConnectionError);

您通常不知道是否总是要“ 重定向到错误页面或类似页面”。也许在您应用程序的某些地方,您可以通过伪造响应数据来处理连接错误,而在其他地方,您可能希望显示错误消息而不是触发重定向。