比方說,我有一個輸入文本字段(更像谷歌搜索字段),當發生更改時,會觸發請求並顯示一些結果。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
一個響應。即使我輸入DOG
,我的模型也會以DO
結果結束。
爲此,我需要一種方法來取消或中止當前正在進行的請求,如果我繼續輸入字符。那樣,我的模型只會被最終的請求所改變。
我輸入如下所示:
<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選項的timeout屬性您可以取消它(通過拒絕延遲對象),但請求仍然由服務器處理,它將在客戶端級別被拒絕。 – PSL
通過不首先發送請求,直到發生短暫停頓,解決此問題可能會更好。如果已經收到請求,則取消該請求將不會阻止服務器處理該請求。請特別注意https://docs.angularjs.org/api/ng/directive/ngModelOptions去抖選項。 –