我正在开发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/