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({

我想在服务中使用angularJs进行后续ajax调用

我试过这样的方法:

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
    }
);