Angularjs 在继续angular.forEach循环之前,我如何等待$http响应

Angularjs 在继续angular.forEach循环之前,我如何等待$http响应,angularjs,Angularjs,我正在为循环中的每个项目发出AJAX请求,end REST服务一次只能执行一个请求,因此我需要循环等待每个请求完成,然后再继续下一个请求。我该怎么做 作为参考,终端服务正在DynamoDB表上执行更新任务-一次只能修改一个表,因此我需要等待直到收到响应后再继续。我可以将它们全部发送到服务器,只需点击一次即可处理,尽管这使得每次更新完成后都很难收到反馈 angular.forEach($scope.someArray, function (value) { var postdat

我正在为循环中的每个项目发出AJAX请求,end REST服务一次只能执行一个请求,因此我需要循环等待每个请求完成,然后再继续下一个请求。我该怎么做

作为参考,终端服务正在DynamoDB表上执行更新任务-一次只能修改一个表,因此我需要等待直到收到响应后再继续。我可以将它们全部发送到服务器,只需点击一次即可处理,尽管这使得每次更新完成后都很难收到反馈

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