如何根据先前的 ajax 响应在循环中触发 ajax 请求

How to trigger ajax requests in loop based on previous ajax response

我有为每个需要更新数量属性的地址选择的送货地址列表,如果之前的更新失败,则基于之前的更新响应需要中止循环。

这是我当前的代码片段。

    $scope.applyQty = (qty) ->
      collections = $filter('filter')($scope.address, {checked: true}, true) #return array of objects
      x = true
      angular.forEach(collections, (address) ->    
        if x
          address.quantity = qty    
          promise = $scope.saveMethod(address)
          promise.then ( (respone) ->
            #dosomething     
          ), (error) ->
            x = false #stop next address
          )
...
$scope.saveMethod = (address) ->
  deferred = $q.defer()
  #some logic
  ..
  #ajax call to update quantity
  address.save().then ((response) ->
    deferred.resolve(response)
  ), (error) ->
    deferred.reject(error)
    address.quantity = 0

  return deferred.promise;

在 applyQty 方法中循环选择送货地址调用 saveMethod。如果一个地址在服务器端更新失败,则停止循环。

如果像我们return 承诺下一次执行一样以适当的方式使用 $q 服务,我用

模拟这段代码
var chaingAjax = function(item) {
  // smiulte ajax request
  var defer = $q.defer();

  $timeout(function() {
    // assume error happen at item 4 execution will end and return error message
    if (item != 4) {
      defer.resolve(item);
      console.log('posted ' + item)
    } else {
      console.log('error 4')
      return defer.reject({
        error: 'bad call ajax stoped at ' + item
      });
    }
  }, 500);

  return defer.promise;
}

var executeList = function(list) {
  console.log(list)
  var item = list.pop()
  var promise = chaingAjax(item).then(function(saved) {
    console.log(saved)
    executeList(list)
  }, function(error) {
    console.log(error)
  });
  return promise
}


executeList([1, 2, 3, 4, 5, 6])
  .then(function() {
    $scope.value = "all done";
  }, function(e) {
    $scope.value = e.error;
  });

并且您可以使用 $http.post() 或任何函数 returning promise

var exeuteMyAjaxCall =  function (list){
    var item = list.pop();
    var promise = $http.post('url', {data:item})
                  .then(function(success){
                       exeuteMyAjaxCall(list);
                   },function(error){ 
                   })

    return promise;
}


exeuteMyAjaxCall (arrayOfData)
  .then(function() {
    $scope.value = "all done";
  }, function(e) {
    $scope.value = e.error;
  });