Я только что столкнулся со странной ситуацией и не смог найти ответ после некоторых поисков.
У меня есть текстовое поле, которое я использую, чтобы позволить пользователю вводить ключевые слова для фильтрации данных таблицы. У меня есть директива ng-change
для элемента ввода, который будет запускать этот код:
return $http.get(url).then(function (response) {
return response.data;
});
Все это прекрасно работало, пока наш тестер не обнаружил нежелательное поведение в IE11. Вот пример ввода «M-A-T-T» в текстовое поле в IE10:
Как видите, каждый последующий запрос занимает больше времени, чем первый, поэтому контроллер получает результат четвертого и последнего запроса.
Вот тот же пример ввода «M-A-T-T» в текстовое поле в IE11.
Необъяснимым образом второй запрос занимает почти 2 секунды, что происходит после завершения четвертого и последнего запроса. Это приводит к тому, что результаты запроса «MA» отображаются, когда пользователь ожидает результатов запроса «MATT» (что в настоящее время находится в его текстовом поле).
Как это можно решить в Angular? Заранее спасибо.
ОБНОВЛЕНИЕ Основываясь на ответе Фрости, я реализовал следующее (в дополнение к подпрыгиванию), которое отлично работает:
var cancelDeferred;
var getUsers = function (criteria) {
if (cancelDeferred) {
cancelDeferred.resolve();
}
cancelDeferred = $q.defer();
return $http.get(url, { timeout: cancelDeferred.promise }).then(function (response) {
cancelDeferred = undefined;
return response.data;
});
};
На самом деле основной проблемой была обработка ошибок при вызове этого метода. Тайм-аут возвращает ошибку точно так же, как 500 возвращает ошибку. Я хочу игнорировать тайм-ауты и обрабатывать фактические ошибки. Вот мое решение для этого:
function onError(data, status) {
if (data.data !== null && data.status !== 0) {
//handle error
}
}
Теперь я попытаюсь выяснить, есть ли способ реализовать это промис-тайминг глобально вместо того, чтобы изменять кучу вызовов $http.get()...
debounce
может быть полезен. Взгляните на второй ответ здесь: stackoverflow.com/questions/14722577/ - person Anderson Pimentel   schedule 29.10.2015