我有一个表,用户可以选择多行并点击删除按钮。我需要我的代码循环选定的记录并删除它们。
我正在调用customerService.delete({id: id})
来删除每条记录,但是我需要知道哪条记录失败了,哪条记录成功,以便我能够正确处理它。
我尝试过使用$q.all
,但我不知道如何知道哪些行失败,哪些行成功:
var promises = [];
$('input:checkbox:checked', $('#customers')).each(function() {
var nRow = $(this).closest('tr')[0];
var aData = oTable.fnGetData(nRow);
var id = aData[0];
promises[id] = customerService.delete({id: id}).$promise;
});
$q.all(promises).then(
function(data) {
console.log(data);
}, function(data) {
console.log(data);
}
);
我如何知道哪些删除操作失败并成功?
编辑:我已尝试过以下内容,但id
和status
未定义。
var promises = [];
$('input:checkbox:checked', $('#customers')).each(function() {
var nRow = $(this).closest('tr')[0];
var aData = oTable.fnGetData(nRow);
var id = aData[0];
var promise = customerService.delete({id: id}).$promise;
promise.then(function(){
return {status: true, id: id}
}).catch(function(){
return {status: false, id: id}
})
promises.push(promise);
});
$q.all(promises).then(function(results) {
$.each(results, function(result) {
console.log(result.id + ' ' + result.status);
});
});
results
看起来像:
答案 0 :(得分:1)
$q.all
接受promise数组。目前,您正在创建基于index
的推送数组,它不会执行任何操作(它将在JSON / Object上运行)。理想情况下,您应该通过执行promises.push
将承诺推送到数组中,如下所示。
promises.push(customerService.delete({id: id}).$promise);
答案 1 :(得分:1)
当您在承诺的$('input:checkbox:checked', $('#customers')).each(function() {
var nRow = $(this).closest('tr')[0];
var aData = oTable.fnGetData(nRow);
var id = aData[0];
var promise = customerService.delete({id: id}).$promise;
promise.then(function(){
return {status: true, id: id}
}).catch(function(){
return {status: false, id: id}
})
promises.push(promise);
});
$q.all(promises).then(function(results) {
var failedDeletes = results.filter(function(item){
return !item.status;
});
});
内返回时,它也会在链中传递已解决的承诺
List<String> list1 = Arrays.asList(This, , , , , , , , reconstruct);
List<String> list2 = Arrays.asList (, is, the, , , , trying, ,);
List<String> list3 = Arrays.asList(, , ,sentence, that, I'm, , to,);
String txt = "";
for (int i = 0; i < list1.size(); i++) {
txt = txt + list1.get(i) + list2.get(i) + list3.get(i) + " ";
}
System.out.println(txt.trim());
答案 2 :(得分:0)
你要做的事情的问题是$ q.all只给出第一个被拒绝的值。来自docs:
如果任何承诺通过拒绝得到解决,则会产生这种情况 承诺将以相同的拒绝价值被拒绝。
您可以在下面的示例中看到这种情况,即使它也被拒绝,也不会返回'test3'。
(function() {
angular
.module('exampleApp', [])
.controller('ExampleController', ExampleController);
function ExampleController($q) {
var vm = this;
var passedResults = [];
var rejectedResults = [];
function pushPassedResults(result) {
passedResults.push(result);
}
function pushRejectedResults(result) {
rejectedResults.push(result);
}
$q.all($q.reject('test1'), $q.reject('test3'),
$q.when('test2'))
.then(
function(data) {
console.log(data);
}, function(data) {
console.log(data);
});
}
ExampleController.$inject = ['$q'];
})();
<!DOCTYPE html>
<html ng-app='exampleApp'>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.5/angular.min.js"></script>
</head>
<body ng-controller="ExampleController as vm">
</body>
</html>
要获得结果,我们需要在$ q.all完成解决承诺之前获取结果。示例如下:
(function() {
angular
.module('exampleApp', [])
.controller('ExampleController', ExampleController);
function ExampleController($q) {
var vm = this;
var passedResults = [];
var rejectedResults = [];
function pushPassedResults(result) {
passedResults.push(result);
}
function pushRejectedResults(result) {
rejectedResults.push(result);
}
$q.all($q.reject('test1').then(pushPassedResults).catch(pushRejectedResults),
$q.reject('test3').then(pushPassedResults).catch(pushRejectedResults),
$q.when('test2').then(pushPassedResults).catch(pushRejectedResults))
.finally(function() {
console.log("Passed results:" + passedResults);
console.log("Rejected results:" + rejectedResults);
});
}
ExampleController.$inject = ['$q'];
})();
<!DOCTYPE html>
<html ng-app='exampleApp'>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.5/angular.min.js"></script>
</head>
<body ng-controller="ExampleController as vm">
</body>
</html>