我试图在中止REST调用后使用{timeout:canceller.promise}来获取已解析的promise对象,但我无法获得已解析的promise对象。
工厂:
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:true)。 error.isAborted未定义。
答案 0 :(得分:0)
您的代码段中有2个承诺:
var P1 = var canceller = $q.defer();
var P2 = $http.get(...)..
如果您使用值V1解析P1,您应该期望使用V1调用P1 然后回调,而不是P2调用。
您应该通过取消承诺(P1)处理取消代码:
canceller.promise.then(function(data){
console.log(data.isAborted);
});
我想您希望Angular使用 $ http.get reject <的处理程序连接超时解析 承诺的处理程序/ em> 承诺,我不认为是指定的。
此外,您可能希望在代码中的某处重置 canceller ,否则如果您调用getDetails()并取消它,已取消将被解析,因此下次您的调用getDetails(),已取消仍将处于已解决状态,如果您尝试取消它,则不会发生任何事情,因为承诺只会解决一次。
答案 1 :(得分:0)
我的响应得到一个config.timeout。$$ state对象,该对象将resolve参数存储在value
中。
.controller('testCtrl', function (abc, $rootScope) {
abc.getDetails().then(function (data) {
// success call back
}, function (error) {
console.log(error.config.timeout.$$state.value.isAborted);
});
$rootScope.$emit('CANCEL_REQUESTS');
});