Отмена углового $http.jsonp приводит к ошибке JavaScript

Я использую Angular версии 1.2.1 и пытаюсь реализовать отмену в моем приложении, когда инициализируется новый запрос того же типа. Я использовал здесь примеры кода, но не смог заставить его работать. Я думаю, что это связано с тем, что я использую $http.jsonp().

Когда я отменяю запрос jsonp, обратные вызовы.then никогда не вызываются (как и ожидалось), но запрос не отменяется, и когда приходит ответ, я получаю неопределенную ошибку в консоли (функция обратного вызова jsonp больше не существует).

Как избежать этой ошибки консоли? Можно ли отменить запрос jsonp alltogheter?

http://jsfiddle.net/HB7LU/8668/

HTML:

<div ng-controller="MyCtrl">
    <span ng-bind="status"></span>
    <hr>
    <a href ng-click="doStuff()">
        Start
    </a>
    <hr>
    <a href ng-click="cancel()">
        Cancel
    </a>
</div>

JS:

var myApp = angular.module('myApp',[]);
function MyCtrl($scope, $q, $http) {
    $scope.status = "Idle";

    $scope.doStuff = function() {
        var canceller = $q.defer();
        $scope.status = "Ongoing";
        $scope.getting = $http.jsonp('http://cruisebookingapi.ving.se/cruisePackage/search/1/STO/141220/false/20141211/42,42/-1?callback=JSON_CALLBACK', {timeout: canceller.promise});
       $scope.getting.then(function(data) {
            $scope.status = "Finished";
            console.log(data);
        });
        $scope.cancel = function() {
            $scope.status = "Cancelled";
            canceller.resolve('Cancel all the things');
        };
    };
}

1 ответ

Решение

Я попытался обновить angularjs до версии 1.2.27 (я должен был попробовать это сначала!), И проблема больше не была. Немного покопавшись на GitHub я нашел исправление. Исправлено с версии 1.2.8

https://github.com/angular/angular.js/commit/95e1b2d6121b4e26cf87dcf6746a7b8cb4c25e7f

исправление ($httpBackend): отмененные запросы JSONP не будут выводить ошибку в консоли

Когда вы отменяете запрос JSONP, angular удаляет для него обратный вызов. Однако сценарий все еще выполняется, и поскольку обратный вызов теперь удален и не определен, сценарий создает исключение, видимое в консоли. Быстрое решение этой проблемы - не удалить обратный вызов, а заменить его на angular.noop,

Закрытие #5615

Закрытие #5616

Изменение, которое решает проблему:

-        delete callbacks[callbackId];
+        callbacks[callbackId] = angular.noop;
Другие вопросы по тегам