【发布时间】:2016-02-04 01:25:29
【问题描述】:
假设我有一个输入文本字段(更像 Google 搜索字段),更改后会触发请求并显示一些结果。
例如,
让我们在输入中输入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..要么我们需要
reject或resolve它来完成它.. -
1) 在您的文本框中使用 debounce,您可以使用 ng-model-options 2) 您可以为 http 选项的 timeout 属性提供一个承诺,您可以取消它(通过拒绝该延迟对象),但该请求仍将由服务器处理,它只会在客户端级别被拒绝。
-
解决这个问题的最好办法是在输入出现短暂暂停之前先不发送请求。如果服务器已经收到请求,取消请求不会停止处理它。查看docs.angularjs.org/api/ng/directive/ngModelOptions 特别是去抖动选项。
标签: javascript angularjs promise deferred