У меня есть таблица, где пользователь может выбрать несколько строк и нажать кнопку удаления. Мне нужно, чтобы мой код перебирал выбранные записи и удалял их.
Я вызываю 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);
}
);
Как узнать, какая из моих операций удаления завершилась с ошибкой?
EDIT: Я пробовал следующее, но я не могу определить 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
выглядят так:
Когда вы возвращаетесь внутрь catch()
обещания, он также передаст разрешенное обещание по цепочке
$('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;
});
});
$q.all
принимает массив обещаний. В настоящее время вы создаете массив на основе index
, который ничего не сделает (он будет работать на JSON/Object). В идеале вы должны подталкивать обещание в массив, выполняя promises.push
как показано ниже.
promises.push(customerService.delete({id: id}).$promise);
Проблема с тем, что вы пытаетесь сделать, состоит в том, что $ q.all дает только первое отклоненное значение. Из документов:
Если какое-либо из обещаний будет разрешено с отклонением, это обещание будет отклонено с тем же значением отклонения.
Это можно увидеть в приведенном ниже примере, где "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>
catch
чтобы выполнить обещание хорошая точка +1, отлично :)status
иid
перезагружен.