我正在开发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)
{
 ...
}

方法二:
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);

    });
};

最佳答案

您可以使用$q.when,它会答应$http,当解析后,它将调用.then内部的函数

$q.when(promiseObj).then(callback);

如果有多个promise,则可以使用$q.all,它接受了promise的数组并在函数中所有的promise都得到解析时调用了then函数。
$q.all([promiseObj1, promiseObj2]).then(callback);

更新

我认为您的第一种方法是正确的,只是错过了几件事
  • for循环条件,它确实创建了一个额外的对象,该对象将是未定义的
  • $q.all应该在.then内部具有功能

  • 代码
    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.
    });
    

    关于javascript - 在下一个请求之前等待$ http promise ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29831665/

    10-09 18:21
    查看更多