为什么当 http.post 失败时 zone.js 抛出 404 Not Found 而有一个捕获和返回对象

Ang*_*One 6 rxjs typescript angular-services angular

也许我不理解它,但是如果我有一个服务并且我从中捕获了任何错误,那么为什么会zone.js抛出 404 not found,而我捕获错误并返回 json 对象,这样客户端就会知道该怎么做。如何避免控制台中的错误?我可以吗?

例如:

return this.http.post(this.callUrl, requestBody)
      .map(this.extractData)
      .catch(this.handleError);
  }

  private extractData(res: Response) {
    let body = res.json();
    return body || { };
  }
  private handleError (error: Response | any) {
    let body = error.json();
    return Observable.throw(body);
  }
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Alu*_*dad 4

问题是你的handleError函数,你传递给的函数catch不处理错误,它实际上将错误转换为新的错误并传播它(失败)。的目的Observable.prototype.catch处理错误,而 的目的Observable.throw创建错误。然后返回此错误以在结果流中引入失败。

这是使用普通 Http 接口的代码的样子

async performPostRequest(requestBody) {
  try {
    await response = this.http.post(this.callUrl, requestBody);
    return this.extractData(response);
  } catch (error) {
    handleError(error);
  }
}

function handleError(error) {
  const unwrappedError = error && typeof error.json === 'function'
    ? error.json() 
    : error;
  throw unwrappedError;
}
Run Code Online (Sandbox Code Playgroud)

我在评论中看到关于 Angular 2 支持哪些功能来处理 http 错误的讨论。它支持您可能需要的所有情况,包括处理 404 错误,但它们的文档非常糟糕。他们所有的 http 示例以及大多数一般示例都有太多代码。

当我说代码太多时,我的意思是它们充满了超出您应该编写的代码以及许多您根本不应该编写的代码。

您在这个问题中粘贴了与他们的教程中的默认错误处理程序非常接近的内容,而没有注意到该行为。

显然你不应该这样做!

但严肃地说,为什么他们要处理所有示例中的所有错误?默认情况下,错误应始终不被处理,以便它们在堆栈中传播并在必须的地方导致失败。

制定总是接住然后重新投掷的规则是一种糟糕的做法。

如果您想要一个通用的错误处理程序,它绝对不属于每个消耗潜在错误源的服务,这是疯狂的,但如果您按照示例操作,这就是您最终会得到的结果。数百行重复的、难以维护的样板文件,下一个参与该项目的人员将不得不费力地阅读这些样板文件才能理解您的业务逻辑。

另外,您应该像在示例中那样将未绑定的方法作为回调传递,但这是一个单独的对话。