Отмена углового $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;