为什么AngularJS的$http success/error方法被弃用?在v1.6中被移除了?

64
AngularJS文档中对$httpsuccesserror方法发布了弃用通知。这个方法被从库中移除的原因是什么?
2个回答

91
问题在于.success.error方法不能链式调用,因为它们忽略返回值。这对于熟悉链式调用的人造成了问题,并鼓励不熟悉链式调用的人编写低质量的代码。请看StackOverflow上使用deferred anti-pattern的所有示例。
引用AngularJS团队中的一位成员的话:
IMO中的.success和.error在API设计上本来就不太好。这个问题突出了一些情况,开发人员会因为他们期望.success和.error像.then一样工作或者反过来而感到困惑。 在完美的世界里,我宁愿放弃这些$http特定的“promises”。相反,我们可以鼓励开发人员使用标准的$q promise API .then和.catch。在使用响应对象方面,明确的参数与响应对象相比,几乎没有什么好处,这是我的看法。 — AngularJS Issue #10508 $http .success/.error与.then的工作方式不同。

弃用通知 (v1.5)

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

— AngularJS $http 服务 API 参考 -- 弃用通知


更新

AngularJS 1.6已经移除了不建议使用的.success.error方法。

Due to b54a39, $http's deprecated custom callback methods - .success() and .error() - have been removed. You can use the standard .then()/.catch() promise methods instead, but note that the method signatures and return values are different.

$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
JavaScript使用的与Promise相关的模式仅为.then(successCallback, errorCallback),因此他们可能旨在使用js模式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接