如何让这更优雅。我找到了许多使用$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
})
})
答案 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
弃用的详细信息,请参阅。
因为调用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