处理中止的http请求 - angularjs

时间:2014-08-28 06:00:19

标签: angularjs

我试图在中止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未定义。

2 个答案:

答案 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');
});