我如何知道Angular和$ q.all请求成功哪些失败

时间:2016-07-23 12:52:19

标签: jquery angularjs promise deferred

我有一个表,用户可以选择多行并点击删除按钮。我需要我的代码循环选定的记录并删除它们。

我正在调用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);
    }
);

我如何知道哪些删除操作失败并成功?

编辑:我已尝试过以下内容,但idstatus未定义。

      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看起来像:

Results array

3 个答案:

答案 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>