35

我想在一个链中进行多个 Ajax 调用。但我也想在每次通话后按摩数据,然后再拨打下一个电话。最后,当所有调用都成功时,我想运行一些其他代码。

我正在为我的 Ajax 调用使用 Angular $http 服务,并希望坚持下去。

可能吗?

4

2 回答 2

53

是的,AngularJS 处理得非常优雅,因为它的$http服务是围绕 PromiseAPI 构建的。基本上,对方法的调用会返回一个 Promise,您可以通过使用该方法$http非常轻松地链接 Promise 。then这是一个例子:

$http.get('http://host.com/first')
   .then(function(result){
    //post-process results and return
    return myPostProcess1(result.data); 
   })
   .then(function(resultOfPostProcessing){
    return $http.get('http://host.com/second'); 
   })
   .then(function(result){
    //post-process results of the second call and return
    return myPostProcess2(result.data); 
   })
   .then(function(result){
      //do something where the last call finished
   });

您也可以将后处理和下一个$http功能结合起来,这完全取决于谁对结果感兴趣。

$http.get('http://host.com/first')
   .then(function(result){
    //post-process results and return promise from the next call
    myPostProcess1(result.data); 
    return $http.get('http://host.com/second'); 
   })
   .then(function(secondCallResult){
     //do something where the second (and the last) call finished
   });
于 2013-04-29T17:45:17.057 回答
9

公认的答案很好,但它并没有解释真正锦上添花的最终方法。这篇关于承诺的精彩文章让我直截了当。以下是基于该文章的一些示例代码:

$scope.spinner.start();

$http.get('/whatever/123456')
  .then(function(response) {
     $scope.object1 = response.data;
     return $http.get('/something_else/?' + $scope.object1.property1);
  })
  .then(function(response) {
     $scope.object2 = response.data;
     if ($scope.object2.property88 == "a bad value")
        throw "Oh no! Something failed!";
     return $http.get('/a_third_thing/654321');
  })
  .then(function(response) {
     $scope.object3 = response.data;
  })
  .catch(function(error) {
     // this catches errors from the $http calls as well as from the explicit throw
     console.log("An error occured: " + error);
  })
  .finally(function() {
     $scope.spinner.stop();
  });
于 2016-05-12T01:30:54.937 回答