2014-08-28 215 views
0

我想在中止REST調用(使用{timeout:canceller.promise})後獲得已解析的promise對象,但我無法獲取已解析的promise對象。處理異常的http請求 - angularjs

廠:

angular.module('RestModule').factory('abc', function ($http, $rootScope) { 
    var canceller = $q.defer(); 
    $rootScope.$on('CANCEL_REQUESTS', function() { 
     canceller.resolve({'isAborted': true}); 
    }); 
    return { 
     getDetails: function() { 
      return $http.get('/test/testREST', {timeout: canceller.promise}).then(function (data) { 
       return httpData.data; 
      }); 
     } 
}); 

控制器:

.controller('testCtrl', function (abc, $rootScope) { 
    abc.getDetails().then(function (data) { 
     // success call back 
    }, function (error) { 
     console.log(error.isAborted); 
    }); 
    $rootScope.$emit('CANCEL_REQUESTS'); 
}); 

在這裏,在錯誤回電我沒有收到超時承諾對象(isAborted:真)。 error.isAborted未定義。

+0

如果您希望得到錯誤處理函數的結果,您不應該調用'canceller.reject'而不是'canceller.resolve'? – andrean 2014-08-28 07:05:41

+0

我最初做了這件事,但在這種情況下它從來沒有進入錯誤處理程序。只有當我解決控制權到達錯誤處理程序。 也使用canceller.resolve仍然到達錯誤處理程序 – 2014-08-28 07:13:46

回答

0

有2個承諾在您的片段:

var P1 = var canceller = $q.defer(); 
var P2 = $http.get(...).. 

如果解決與值V1 P1,你應該期望P1 然後回調與V1被調用,而不是P2的。

你應該通過消除承諾(P1)辦理解除代碼:

canceller.promise.then(function(data){ 
    console.log(data.isAborted); 
}); 

我猜你期望角度要連接的超時的處理程序與的處理決心承諾$ http.get 拒絕承諾,我不認爲是指定的。

你也可能要重新消除地方在你的代碼,否則,如果你調用getDetails(),並取消它,取消將得到解決,那麼下一次你的電話getDetails(),取消會仍然處於解決狀態,如果您嘗試取消它,則不會發生任何事情,因爲承諾只解決一次。