Как узнать с Angular и $ q.all, какие запросы были выполнены успешно, а какие - нет

0

У меня есть таблица, где пользователь может выбрать несколько строк и нажать кнопку удаления. Мне нужно, чтобы мой код перебирал выбранные записи и удалял их.

Я вызываю 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 выглядят так:

Изображение 174551

Теги:
promise
deferred

3 ответа

1

Когда вы возвращаетесь внутрь 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;
   });
});
  • 0
    возвращайся с catch чтобы выполнить обещание хорошая точка +1, отлично :)
  • 0
    Спасибо за ответ. Смотрите мое обновление. Я не вижу status и id перезагружен.
Показать ещё 3 комментария
1

$q.all принимает массив обещаний. В настоящее время вы создаете массив на основе index, который ничего не сделает (он будет работать на JSON/Object). В идеале вы должны подталкивать обещание в массив, выполняя promises.push как показано ниже.

promises.push(customerService.delete({id: id}).$promise);
  • 0
    Почему возникает проблема при добавлении обещания в массив по индексу? Почему это нужно толкать?
0

Проблема с тем, что вы пытаетесь сделать, состоит в том, что $ 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>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню