2016-07-23 53 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); 
    } 
); 

我怎麼知道哪個我刪除操作的失敗和成功了嗎?

編輯:我已經嘗試了下面,但我得到undefined爲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

回答

1

$q.all接受承諾陣列。目前您在這裏創建基於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已經完成了解決的承諾的結果。下面的例子:

(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

當你內心的一個承諾的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'重新開始。 – Lock

+0

那麼'結果'看起來像什麼? – charlietfl

相關問題