【问题标题】:Handling Errors early in the Promise Chain在 Promise 链的早期处理错误
【发布时间】: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,可以早点使用awaitreturn
  • 这可能比我每次使用连接时实际处理错误更糟糕。但遗憾的是,这只是证实,没有更优雅的本地方式来处理这个问题。 :-/
  • const { data } = await connection.getData(); if (!data) return; 看起来相当干净 IMO,但不幸的是你必须在 getData 的所有消费者中使用它,我想知道是否有更好的方法
  • 我有一个想法,如果你不喜欢await / return,使用回调你可以调用.then on。它看起来很奇怪,但它减少了重复的捕获代码jsfiddle.net/m0wheoa1
  • 你可以在getData中返回一个新的promise,如果有错误就拒绝它。这应该会停止执行,同时不会冒出任何错误,尽管它还需要一些额外的工作。不确定您对本地人的定义是否可以接受。

标签: javascript


【解决方案1】:

解决此问题的最佳方法是进行最终捕获以处理所有错误。例如:

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

然后:

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

如果链上的 fetch 或任何其他 promise 产生错误,则 then() 语句的其余部分将被跳过并被最终的 catch 函数捕获。从那里你需要确保所有承诺可能引发的所有类型的错误都得到处理。

但是,您需要摆脱 getData 中的捕获,因为它会导致链的其余部分照常运行,因为错误已得到处理。

希望有帮助

【讨论】:

    【解决方案2】:

    那么实际上没有比每次在我的应用程序某处使用getData() 函数时捕获和处理错误更好的方法了吗?

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

    function getData() {
      return fetch(myEndpoint)
    }
    
    // elsewhere:
    connection.getData().then(handleData, handleConnectionError);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 2019-02-17
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 2019-01-05
      相关资源
      最近更新 更多