根据前一次通话的结果发出http请求

时间:2015-12-19 12:35:10

标签: angularjs

如何让这更优雅。我找到了许多使用$q.all()生成多次请求的示例,但没有根据前一次调用的结果发出请求。

    $scope.data = [];
    $scope.data2 = [];

    $http({
        url: '/some/url',
        method: "GET"
    })
    .success(function(data){
        $scope.data = data
    })
    .then(function(result)){

        $http({
            url: '/some/url2',
            method: "GET",
            params: {
                param    : result.data.param //data returned by the fist call
            }
        })
        .success(function(data){
            $scope.data2 = data
        })

    })

1 个答案:

答案 0 :(得分:0)

对我而言,返回数据和更为优雅。

//first scope variable not needed
//$scope.data = [];
$scope.data2 = [];

$http({ url: '/some/url',
        method: "GET"
}).then( function(response){
    return response.data;
}).then( function(someData){
    var httpPromise = 
          $http({ url: '/some/url2',
                  method: "GET",
                  params: {
                    param: someData.param //someData chained
                  }
               });
    return httpPromise;
}).then (function(promiseResult){
    $scope.data2 = promiseResult.data
});

我避免使用.success.error方法有两个原因:忽略返回值已弃用。有关.success.error弃用的详细信息,请参阅enter image description here

链接承诺

因为调用promise的then方法会返回一个新的派生promise,所以很容易创建一个promise链:

promiseB = promiseA.then(function(result) {
  return result + 1;
});

// promiseB will be resolved immediately after promiseA is resolved and its value
// will be the result of promiseA incremented by 1

可以创建任意长度的链,并且由于可以使用另一个承诺(将进一步推迟其解析)来解决承诺,因此可以在链中的任何点暂停/推迟承诺的解析。这样就可以实现强大的API,如$http的响应拦截器。

- AngularJS $http Service API Reference -- deprecation notice