为什么不赞成AngularJS $ http成功/错误方法?从v1.6中删除了?

时间:2016-02-11 01:45:53

标签: angularjs angularjs-http angularjs-1.6

AngularJS文档包含$http successerror方法的弃用通知。这个抽象是从库中删除的具体原因吗?

2 个答案:

答案 0 :(得分:78)

问题是.success.error方法无法链接,因为忽略返回值。这会给熟悉链接的人带来问题,并鼓励不熟悉链接的人员编写错误的代码。见证StackOverflow上使用deferred anti-pattern

的所有示例

引用一个AngularJS团队:

  

首先,IMO .success.error是一个糟糕的API设计。此问题突出了一些开发人员感到困惑的情况,因为他们希望.success.error的工作方式与.then相同,反之亦然。   在一个完美的世界里,我宁愿放弃这些$http特定的#34;承诺"。相反,我们可以鼓励开发人员使用标准$q承诺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

更新

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

  

由于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

答案 1 :(得分:1)

它使用的javascript与promises相关的模式仅与.then(successCallback, errorCallback)一致,因此它们可能旨在使用js模式。