为啥不推荐使用 AngularJS $http 成功/错误方法?从 v1.6 中删除?

Posted

技术标签:

【中文标题】为啥不推荐使用 AngularJS $http 成功/错误方法?从 v1.6 中删除?【英文标题】:Why are AngularJS $http success/error methods deprecated? Removed from v1.6?为什么不推荐使用 AngularJS $http 成功/错误方法?从 v1.6 中删除? 【发布时间】:2016-05-21 15:24:26 【问题描述】:

AngularJS 文档有一个关于 $http successerror 方法的弃用通知。从库中删除此抽象是否有特定原因?

【问题讨论】:

【参考方案1】:

问题在于.success.error 方法不可链接,因为它们忽略返回值。这会给熟悉 chaining 的人带来问题,并鼓励不熟悉 chaining 的人编写糟糕的代码。见证 *** 上所有使用 deferred anti-pattern 的示例。

引用 AngularJS 团队之一的话:

IMO .success.error 首先是 API 设计的糟糕之处。这个问题突出了开发人员感到困惑的许多情况,因为他们要么期望.success.error 以与.then 相同的方式工作,反之亦然。 在一个完美的世界里,我宁愿放弃这些$http 特定的“承诺”。相反,我们可以鼓励开发人员使用标准的 $q promise API .then.catch。使用显式参数与使用响应对象相比,IMO 几乎没有什么好处。

— AngularJS Issue #10508 $http .success/.error dissimilar from how .then works.

弃用通知 (v1.5)

$http 旧承诺方法 successerror 已被弃用。请改用标准的then 方法。如果将$httpProvider.useLegacyPromiseExtensions 设置为false,那么这些方法将抛出$http/legacy 错误。

— AngularJS $http Service API Reference -- deprecation notice


更新

已从 AngularJS 1.6 中删除了已弃用的 .success.error 方法。

由于 b54a39、$http 的已弃用自定义回调方法 - .success().error() - 已被删除。您可以改用标准的.then()/.catch() promise 方法,但请注意方法签名和返回值是不同的。

$http(...)
  .then(function onSuccess(response) 
    // Handle success
    var data = response.data;
    var status = response.status;
    var statusText = response.statusText;
    var headers = response.headers;
    var config = response.config;
    ...
  ).catch(function onError(response) 
    // Handle error
    var data = response.data;
    var status = response.status;
    var statusText = response.statusText;
    var headers = response.headers;
    var config = response.config;
    ...
  );

— AngularJS Developer Guide - Migrating to v1.6 - http

【讨论】:

【参考方案2】:

它使用的javascript与promise相关的模式只有.then(successCallback, errorCallback),所以他们可能打算使用js模式。

【讨论】:

以上是关于为啥不推荐使用 AngularJS $http 成功/错误方法?从 v1.6 中删除?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 AngularJS 指令中不推荐使用 `replace` 属性? [复制]

为啥AngularJS的$http指定了Request Method无效

为啥这个 AngularJS 代码中的 HTTP POST 返回空? [复制]

angularjs拦截器:为啥在$http拦截器中没有收到正确的状态码和消息

为啥 AngularJS 在选择中包含一个空选项?

为啥不推荐使用本机 Visual C++ 中的事件处理?