在下一个请求之前等待$ http promise

时间:2015-04-23 18:33:50

标签: javascript angularjs promise angular-http angular-promise

我正在使用angularJS应用程序,这是我使用此框架的第一个网站。在我的应用程序中,我需要在for循环中进行$ http调用。在下一次迭代之前的循环中,我想等待前一次调用的响应。什么是最好和最简单的方法来做到这一点。我已经尝试过使用callBack,$ q.all(),. then在所有这些中只有最后一个请求正在通过。请帮忙。

注意:我通过$ http调用的API无法排队请求。

修改  我已经尝试了以下两种方法,在这两种情况下,只有最后一个请求成功完成。你能告诉我在这里做错了吗?

方法1:

var promiseArray=[];

for(var i=0;i<items.length;i++)
{
 var promise=services.Post(items[i]);
 promiseArray.push(promise);
}

$q.all(promiseArray).then(data)
{
 ...
}

方法2:

var promises = [];

for (var i = 0; i < items.length; i++) {

    var deffered = $q.defer();
    var promise = services.Post(items[i]);
    promise.success(function(data) {
        deffered.resolve(data);
    })
    promises.push(deffered);
}

var result = $ q.all(promises);

编辑:2 服务代码:

Services.Post = function(lineItemId, submitUrl) {
    var url = (submitUrl) ? submitUrl : Services.serviceUrl;

    return $http.post(url, {
        "LineItemID": lineItemId
    }).
    success(function(data, status, headers, config) {
        Services.processResponse(data, status, headers, config);
    }).
    error(function(data, status, headers, config) {

        JL('Angular').error('Error response when calling Service ' + config);

    });
};

1 个答案:

答案 0 :(得分:6)

您可以使用$q.when,承诺$http&amp;当它得到解决时,它会调用.then

中的函数
$q.when(promiseObj).then(callback);

如果有多个承诺,那么您可以使用$q.all来接受承诺数组&amp;当函数内的所有promise都得到解析时,调用then函数。

$q.all([promiseObj1, promiseObj2]).then(callback);

<强>更新

我认为你的第一种方法是对的,只是错过了几件事

  1. for循环条件,它会创建一个未定义的额外对象
  2. $q.all应该在.then
  3. 中设置功能

    <强>代码

    var promiseArray=[];
    
    for(var i=0; i < items.length - 1;i++) //<-- change from i<items.length
    {
     var promise=services.Post(items[i]);
     promiseArray.push(promise);
    }
    
    $q.all(promiseArray).then(function(data) //<-- it should be function in .then
    {
      //this will called after all promises get resolved.
    });