Angularjs 根据上一次调用的结果发出http请求
如何使这个更优雅。我发现了许多使用Angularjs 根据上一次调用的结果发出http请求,angularjs,Angularjs,如何使这个更优雅。我发现了许多使用$q.all()进行多次请求的示例,但没有任何关于根据前一次调用的结果进行请求的示例 $scope.data = []; $scope.data2 = []; $http({ url: '/some/url', method: "GET" }) .success(function(data){ $scope.data = data }) .then(func
$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
})
})
您只需使用
。然后
即可实现此目的,而无需使用成功
和错误
回调。然后
是可链接的,因此您可以基于上一次调用的数据发出新的http请求:
$scope.data = [];
$scope.data2 = [];
$http({
url: '/some/url',
method: "GET"
})
.then(function(data) {
$scope.data = data.data;
$http({
url: '/some/url2',
method: "GET",
params: {
param: data.data.param //data returned by the fist call
}
})
.then(function(data){
$scope.data2 = data.data;
})
});
另外,请注意在响应中更改为
data.data
。您可以简单地使用。然后
用于此目的,而不使用.success
和回调。然后
是可链接的,因此您可以基于上一次调用的数据发出新的http请求:
$scope.data = [];
$scope.data2 = [];
$http({
url: '/some/url',
method: "GET"
})
.then(function(data) {
$scope.data = data.data;
$http({
url: '/some/url2',
method: "GET",
params: {
param: data.data.param //data returned by the fist call
}
})
.then(function(data){
$scope.data2 = data.data;
})
});
另外,请注意在响应中更改为data.data
。对我来说,返回数据并从中链接更为优雅
//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
的详细信息,请参阅
连锁承诺
因为调用承诺的then
方法会返回一个新的派生承诺,所以很容易创建承诺链:
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
的响应拦截器
--对我来说,返回数据和从中链接数据更加优雅
//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
的详细信息,请参阅
连锁承诺
因为调用承诺的then
方法会返回一个新的派生承诺,所以很容易创建承诺链:
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
的响应拦截器
--谢谢,但我想买更高雅的。。你的回答和我现在做的几乎一样。这就是你如何做的,通过服务或服务可以更优雅function@Lorenzo更优雅的方式可能取决于特定的用例。但这似乎是最普遍和最被接受的方式。当我需要通过响应分页,或使用接收到的数据发出更多请求时,我通常递归调用。您需要使用$q
创建一个承诺,将延迟=$q.defer()
传递给函数,例如函数fetchData(deferred,url,params)
并在最后一个请求完成时解决它。谢谢,但我正在寻找更优雅的东西。。你的回答和我现在做的几乎一样。这就是你如何做的,通过服务或服务可以更优雅function@Lorenzo更优雅的方式可能取决于特定的用例。但这似乎是最普遍和最被接受的方式。当我需要通过响应分页,或使用接收到的数据发出更多请求时,我通常递归调用。您需要使用$q
创建承诺,将延迟=$q.defer()
传递给函数,例如函数fetchData(延迟、url、参数)
并在最后一次请求完成时解决它。关于如何改进现有工作代码的问题通常提交到关于如何改进现有工作代码的问题通常提交到