12

如何complete()使用 Angular.js 提供的 promise API 确保无论 $http 调用的结果如何,该函数都会运行?

$http({
    method: 'POST',
    url: submitUrl,
    data: $scope.data
})
.success(function(data) {
      // execute this code on success
})
.error(function(data) {
      // execute this code on error
})
.complete(function() {
  // execute this code regardless of outcome
});

一旦请求完成,可以使用它来隐藏 AJAX 微调器图标。无论请求结果如何,您都希望隐藏微调器。

4

3 回答 3

18

我不是世界上最伟大的 Angular.js 专家,但我知道您可以执行以下操作:

whatever.then(function() {
    // success code here
}, function() {
    // error code here
    return true; // return anything that's not undefined (and not a `throw()`) to force the chain down the success path at the following then().
}).then(function() {
    // "complete" code here
});

你基本上被迫从一个或多个中设计一些东西.then(),这是 $q 承诺的唯一方法。

于 2013-06-19T01:45:04.663 回答
12

这取决于你想做什么,但对于清理逻辑和类似的事情,你也可以使用finally()在履行或拒绝你的承诺时运行:

promise.finally(function () {
    // Do something regardless of outcome.
});

请注意,虽然finally()$q(和其他一些库)支持,但不是官方草案的一部分。

于 2014-06-03T08:13:22.937 回答
8

如果您不在乎请求是否成功,那么您可以将相同的回调传递给successand error...

   var cb = function(response){
      // do something
   };


   $http.post(submitUrl, $scope.data).success(cb).error(cb);

   // OR

   $http.post(submitUrl, $scope.data).then(cb, cb);

但请注意,回调successerror回调具有不同的签名then

此外,模板引擎以角度识别承诺,这意味着在模板中,您可以将附加到范围的承诺视为结果值。

这意味着您可以这样做:

控制器:

$scope.article = $http.get('/articles/' + articleId);

模板:

<article ng-cloak>
   <h3>{{article.title}}</h3>
   <div>{{article.content}}</div>
</article>

$http.getpromise 被解决时,视图会更新。

于 2013-06-19T02:37:27.027 回答