AngularJS - 如何取消承诺?

时间:2015-11-03 18:49:02

标签: javascript angularjs promise deferred

我们说我有一个输入文字字段(更像是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。即使我输入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;
    });
}

3 个答案:

答案 0 :(得分:4)

通常在这种情况下,人们会使用ng-model-options={debounce: 100}

https://docs.angularjs.org/api/ng/directive/ngModelOptions

无论如何你可以拒绝承诺。

答案 1 :(得分:1)

我认为你想在这种情况下使用debounce技术吗?

见:

答案 2 :(得分:0)

像这样:$q.reject(response);

虽然从技术上来说我认为上述评论者是正确的,但你实际上是在拒绝承诺,而不是真正取消它。