2014-08-28 3 views
0

Я пытаюсь получить разрешенный объект обещания после прерывания вызова REST (используя {timeout: canceller.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

+0

Я сделал это изначально, но в этом случае он никогда не приходил к обработчику ошибок. Только если я разрешаю управление, он достигает обработчика ошибок. Кроме того, использование canceller.resolve по-прежнему достигает обработчика ошибок –

ответ

0

Есть 2 обещает в вашем фрагменте кода:

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

Если разрешить P1 со значением V1, следует ожидать P1 затем обратные вызовы называются с V1, но не П2 из них.

Вы должны обрабатывать код отмены через компенсатор обещание (P1):

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

Я думаю, вы ожидаете Угловым телеграфировать обработчик в таймауте решительность обещания с обработчиком $ http.get Отклонить обещание, о котором я не думаю, указано.

Также вы можете сбросить подавитель где-то в коде, в противном случае, если вы звоните getDetails() и отменить его, отменен будет решен, поэтому в следующий раз, когда ваш getDetails вызова(), отменен будет все еще находятся в разрешенном состоянии, и если вы попытаетесь его отменить, ничего не произойдет, поскольку обещания разрешаются только один раз.

Смежные вопросы