Предположим, у меня есть текстовое поле ввода (более похожее на поле поиска Google), которое при изменении вызывает запрос и показывает некоторые результаты.AngularJS - Как отменить обещание?
Например,
впишем в Dog
на входе:
typed D -> Calls ctrl.search('D') -> Makes a request -> Changes model when success
typed DO -> Calls ctrl.search('DO') -> Makes a request -> Changes model when success
typed DOG -> Calls ctrl.search('DOG') -> Makes a request -> Changes model when success.
Теперь, скажем, что DO
запрос отвечает позже, чем DOG
один. Моя модель закончила бы с результатами DO
, даже если бы я набрал DOG
.
Для этого мне нужно отменить или прервать текущие текущие запросы, если я продолжаю вводить символы. Таким образом, моя модель изменяется только по окончательному запросу.
Мой вход выглядит следующим образом:
<input type="text" class="form-control" data-ng-model="query" data-ng-change="ctrl.search(query)" placeholder="Search" />
Вот мой searchCtrl.js
:
var search;
var language;
var _this;
var SearchCtrl = function (searchService, lang)
{
search = searchService;
langauge = lang;
_this = this;
}
SearchCtrl.prototype.search = function (text)
{
var promise = search.language(language)
.facet('characters')
.highlight('quotes')
.query(text);
promise.then(function (response) {
if(!response) return;
_this.total = response.total;
_this.count = response.found;
_this.result = response.data;
});
}
Мы не можем отменить promise..either мы должны '' reject' или resolve' его, чтобы завершить его .. –
1) Используйте debounce в своем текстовом поле, вы можете использовать ng-model-options 2) Вы можете предоставить обещание тайм-ауту свойства http, которое вы можете отменить его (отклонив этот отложенный объект), но запрос все равно будет обработан сервером, он будет просто отклонен на уровне клиента. – PSL
Скорее всего, лучше решить эту проблему, не отправив запрос в первую очередь до тех пор, пока не произойдет короткая пауза при наборе текста. Отмена запроса не остановит сервер от его обработки, если он уже получил его. загляните в https://docs.angularjs.org/api/ng/directive/ngModelOptions с опцией debounce. –