angularJs中的后续ajax调用
我想在服务中使用angularJs进行后续ajax调用 我试过这样的方法:angularJs中的后续ajax调用,angularjs,Angularjs,我想在服务中使用angularJs进行后续ajax调用 我试过这样的方法: var requests = [ {'url': 'call1'}, {'url': 'call2'}, {'url': 'call3'} ]; return $q.all([ $http({ url: requests[0], method: "POST" }).then( /*callback*/ ), $http({
var requests = [
{'url': 'call1'},
{'url': 'call2'},
{'url': 'call3'}
];
return $q.all([
$http({
url: requests[0],
method: "POST"
}).then( /*callback*/ ),
$http({
url: requests[1],
method: "POST"
}).then( /*callback*/ )
]);
但这使得AllaAjax并行。我需要一种方法使这个调用后续,所以在第一个端点之后,它调用第二个…您应该能够在“then”回调中调用另一个$http调用,返回$http的返回值
$http({...})
.then(function() {
return $http({...});
})
.then(function() {
return $http({...});
});
这是因为对$http的每次调用都会返回一个承诺。如果您在“then”成功回调中返回一个承诺,那么链中的下一个“then”回调将被延迟,直到该承诺得到解决,这将是ajax调用完成时
编辑:作为对注释的响应,您可以循环处理一系列请求:
var requests = [
{'url':'call1','method':'get'},
{'url':'call2','method':'get'},
{'url':'call3','method':'get'}
];
var promise = null;
angular.forEach(requests, function(details) {
promise = $q.when(promise).then(function() {
return $http(details);
});
});
就像在那次袭击中一样。
$q.when
仅用于循环的第一个值,当promise
设置为null
时,它有一个然后立即调用的回调。您可以链接承诺:
var requests =[{'url':'index.html'},
{'url':'index.html'},
{'url':'index.html'}];
function makeCall(n) {
return $http({url:requests[n].url+"?n="+n,method:"GET"}).then(function(r) {
if (n+1<requests.length) return makeCall(n+1);
});
}
makeCall(0);
var请求=[{'url':'index.html'},
{'url':'index.html'},
{'url':'index.html'}];
函数makeCall(n){
返回$http({url:requests[n].url+“?n=“+n,方法:“GET”})。然后(函数(r){
如果(n+1您可以使用:
从:
每个系列(arr、迭代器、回调)
与每个迭代器相同,仅迭代器应用于串联数组中的每个项。仅在当前迭代器完成处理后调用下一个迭代器。这意味着迭代器函数将按顺序完成
arr
-要迭代的数组
iterator(item,callback)
-应用于数组中每个项的函数。迭代器被传递一个回调(err)
,完成后必须调用该回调。如果没有发生错误,则应在没有参数或显式空参数的情况下运行回调
回调(err)
-在所有迭代器函数完成或发生错误后调用的回调
是的,但是如果我有很多调用,这会变得更加冗长。我想要一个简单的解决方案,在数组中的每个url上循环,一次调用一个。我已经添加了一个部分,说明如何在循环中使用它。这个循环不会一直没有阻塞吗?asker希望串联执行请求。没有一个解决方案使用$http s应该使用“block”,因为它们都是异步的。但是,如果您询问是否所有请求都将同时运行,而不是按顺序运行,则不应使用“no”。唯一可以立即调用然后回调的承诺是第一个。其他所有请求都将等待,直到调用$http
完成。我很抱歉我在http调用之间做了一个额外的$timeout,显示了这一点。后续调用是否需要使用以前调用的响应中的信息,或者您只是给服务器时间一次一个地完成一系列步骤?如果一个请求失败,是否要中止所有后续请求?
var requests = ['call1', 'call2', 'call3'];
function iterator(request, done) {
$http({
url: request,
method: "POST"
}).then(done);
};
async.eachSeries(
requests,
iterator,
function (err) {
// Done
}
);