2014-08-28 175 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(),取消会仍然处于解决状态,如果您尝试取消它,则不会发生任何事情,因为承诺只解决一次。