【问题标题】:Wait for $http promise before the next request在下一个请求之前等待 $http 承诺
【发布时间】:2015-06-21 02:48:12
【问题描述】:

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

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

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

方法一:

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 结果 = $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);

    });
};

【问题讨论】:

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


【解决方案1】:

你可以使用$q.when,它会接受$http的承诺,当它被解决时,它会调用.then中的函数

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

如果有多个promise,那么您可以使用$q.all,它会接受promise 数组并在函数内的所有promise 都被解析时调用然后函数。

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

更新

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

  1. for 循环条件,它确实创建了一个未定义的额外对象
  2. $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.
});

【讨论】:

  • 嗨Pankaj,感谢您的回复,我尝试了上面提到的不同方法。有不对的地方请大家看一下,指正。
  • @AjaySrikanth 你的第一种方法看起来很酷......我认为在角度服务中你没有返回承诺,你应该从服务中返回承诺......如果你有任何疑问然后......添加你也有角度服务代码..我也会帮助处理该代码
  • 感谢您的帮助,我已将我的服务代码复制到这里,请您看一下
  • @AjaySrikanth 对你有帮助吗
  • 这实际上对我没有帮助,因为我正在调用的服务无法对请求进行排队,并且可以一个接一个地处理请求。
猜你喜欢
  • 1970-01-01
  • 2020-04-22
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 2015-12-22
  • 2021-09-08
相关资源
最近更新 更多