2016-07-23 3 views
0

사용자가 여러 행을 선택하고 삭제 버튼을 누를 수있는 테이블이 있습니다. 선택한 레코드를 반복 재생하고 삭제하려면 코드가 필요합니다.

나는 각 레코드를 삭제하기 위해 customerService.delete({id: id})을 호출하고 있는데, 나는 그것을 적절하게 다룰 수 있도록 어떤 레코드가 실패했는지 그리고 어떤 레코드가 성공했는지 알아야한다.

나는 $q.all를 사용하여 시도하지만 실패하고있는이 succeedd 행을 ​​알고하는 방법을 잘 모르겠어요 :

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에 대해 정의되지 않았습니다.

Results array

답변

1

$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]; 
      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는 것 같습니다. 현재 여기서 index 푸시 배열을 기반으로 아무 것도하지 않을 것입니다 (JSON/Object에서 작동합니다). 이상적으로 아래에 나와있는 것처럼 promises.push을 수행하여 약속을 배열로 푸시해야합니다.

promises.push(customerService.delete({id: id}).$promise); 
+0

이유에 약속을 추가하는 문제가 인덱스에 의한 배열? 왜 밀어야할까요? – Lock

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는 약속을 해결 완료 전에 $를 얻을 필요가 결과를 얻으려면. 예 아래 : 당신이 약속의 catch() 안에 돌아 오면

(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>

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; 
    }); 
}); 
+0

약속을 지키기 위해 '잡기'에서 돌아온다 좋은 +1, 위대한 :) –

+0

답장을 보내 주셔서 감사합니다. 내 업데이트를 참조하십시오. 나는'상태'와'아이디'가 재현되는 것을보고 있지 않다. – Lock

+0

그래서'results'는 어떻게 생겼습니까? – charlietfl