Angularjs 在继续angular.forEach循环之前,我如何等待$http响应
我正在为循环中的每个项目发出AJAX请求,end REST服务一次只能执行一个请求,因此我需要循环等待每个请求完成,然后再继续下一个请求。我该怎么做 作为参考,终端服务正在DynamoDB表上执行更新任务-一次只能修改一个表,因此我需要等待直到收到响应后再继续。我可以将它们全部发送到服务器,只需点击一次即可处理,尽管这使得每次更新完成后都很难收到反馈Angularjs 在继续angular.forEach循环之前,我如何等待$http响应,angularjs,Angularjs,我正在为循环中的每个项目发出AJAX请求,end REST服务一次只能执行一个请求,因此我需要循环等待每个请求完成,然后再继续下一个请求。我该怎么做 作为参考,终端服务正在DynamoDB表上执行更新任务-一次只能修改一个表,因此我需要等待直到收到响应后再继续。我可以将它们全部发送到服务器,只需点击一次即可处理,尽管这使得每次更新完成后都很难收到反馈 angular.forEach($scope.someArray, function (value) { var postdat
angular.forEach($scope.someArray,
function (value) {
var postdata = {
bla: value
};
$http.post('/some_url', postdata)
.then(
function(result) {
console.log("Success.");
},
function(data) {
console.log("Failure.");
}
);
}
);
你真的需要餐车吗?我不会用它来做这样的事情:
function req(arr) {
if (angular.isArray(arr) && arr.length > 0) {
var postdata = {
bla: arr[0]
};
$http.post('/some_url', postdata)
.then(
function(result) {
console.log("Success.");
arr.shift();
req(arr);
},
function(data) {
console.log("Failure.");
// if you want to continue even if it fails:
//arr.shift();
//req(arr);
}
);
}
}
req($scope.someArray);
如果您确实必须一次提出一个请求(您确定没有更有效的替代方案吗?),那么您必须使用除
Angular.forEach
之外的其他方法
像这样的东西怎么样(您需要注入$q
):
你能把整个数组发送回来,用一个请求而不是循环返回一个数组吗,但我更愿意单独完成这些操作,以便在每个操作完成时显示反馈。我正在更新DynamoDB表-不幸的是,一次只能完成一个操作,因此唯一的其他方法是将它们全部发布并在服务器上处理问题。您的解决方案适合我的需要,因为我可以在每个表更新后单独返回反馈。
req(arr.shift())
将移位值发送到下一个函数调用,而不是新数组。您的代码应该是这样的:arr.shift();请求(arr)代码>@PrashantPokhriyal你说得对!谢谢你的关注!我更新了答案。
function doWhateverWithAll(someArray) {
// Mark which request we're currently doing
var currentRequest = 0;
// Make this promise based.
var deferred = $q.deferred();
// Set up a result array
var results = []
function makeNextRequest() {
// Do whatever you need with the array item.
var postData = someArray[currentRequest].blah;
$http.post('some/url', postData)
.then( function (data){
// Save the result.
results.push(data);
// Increment progress.
currentRequest++;
// Continue if there are more items.
if (currentRequest < someArray.length){
makeNextRequest();
}
// Resolve the promise otherwise.
else {
deferred.resolve(results);
}
});
// TODO handle errors appropriately.
}
// return a promise for the completed requests
return deferred.promise;
}
doWhateverWithAll($scope.someArray)
.then(function(results){
// deal with results.
});