2015-05-15 48 views
0

onRejection所以我有這樣一段代碼:

 var deferred = $q.defer(); 
     var promises = []; 

     angular.forEach($scope.devices, function(device){ 
      var promise = memberService.InsertDevice(memberId, device).then(function (data) { 
       //device inserted 
      }, function (rejectData) { 
       if (rejectData.Error == "Cannot insert record since it already exists") { 
        alert("The number " + device.PhoneNumber + " already exists. Try with a different number."); 
       } 
      }); 

      promises.push(promise); 
     }); 

     $q.all(promises).then(function (data) { 
      //perform something on Success 
     }, function (data) { 
      //perform something on rejection 
      //THIS NEVER GETS CALLED EVEN IF I GET THE ALERT FROM THE TOP 
     }); 

看一看最後一個註釋。出於某種原因,即使我得到警報(意味着其中一個呼叫出現問題),整體拒絕也不會被調用。

回答

1

承諾讓您有機會在您的失敗中「恢復」,因此您必須在錯誤句柄中返回拒絕$q.all以知道其實際失敗。以下代碼中的唯一三角洲是return $q.reject(rejectData);

var deferred = $q.defer(); 
    var promises = []; 

    angular.forEach($scope.devices, function(device){ 
     var promise = memberService.InsertDevice(memberId, device).then(function (data) { 
      //device inserted 
     }, function (rejectData) { 
      if (rejectData.Error == "Cannot insert record since it already exists") { 
       alert("The number " + device.PhoneNumber + " already exists. Try with a different number."); 
      } 
       return $q.reject(rejectData); 
     }); 

     promises.push(promise); 
    }); 

    $q.all(promises).then(function (data) { 
     //perform something on Success 
    }, function (data) { 
     //perform something on rejection 
     //THIS NEVER GETS CALLED EVEN IF I GET THE ALERT FROM THE TOP 
    }); 
+0

ohhhh return !!我正在嘗試只用'$ q.reject(rejectData);'而且它也沒有工作。雖然有意義。謝謝! – Jan