如何根据先前的 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;
});
我有为每个需要更新数量属性的地址选择的送货地址列表,如果之前的更新失败,则基于之前的更新响应需要中止循环。
这是我当前的代码片段。
$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;
});