2015-11-03 4 views
8

Предположим, у меня есть текстовое поле ввода (более похожее на поле поиска 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; 
    }); 
} 
+0

Мы не можем отменить promise..either мы должны '' reject' или resolve' его, чтобы завершить его .. –

+1

1) Используйте debounce в своем текстовом поле, вы можете использовать ng-model-options 2) Вы можете предоставить обещание тайм-ауту свойства http, которое вы можете отменить его (отклонив этот отложенный объект), но запрос все равно будет обработан сервером, он будет просто отклонен на уровне клиента. – PSL

+0

Скорее всего, лучше решить эту проблему, не отправив запрос в первую очередь до тех пор, пока не произойдет короткая пауза при наборе текста. Отмена запроса не остановит сервер от его обработки, если он уже получил его. загляните в https://docs.angularjs.org/api/ng/directive/ngModelOptions с опцией debounce. –

ответ

4

Обычно для этого случая люди используют ng-model-options={debounce: 100}.

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

в любом случае вы можете отказаться от обещания.

+0

Это сделало трюк! Большое спасибо! Это как задержка перед отправкой каждого запроса? –

+0

да, это помогает вам;) приветствую. – Errorpro

+0

@MatiasCicero это в основном тайм-аут, который сбрасывается каждый раз при изменении значения. поэтому, если значение перестает меняться на 100 мс, таймер заканчивается и отправляется запрос. –

0

Как это: $q.reject(response);

Хотя технически я считаю, что выше комментатора правильно, вам «фактически отвергаю обещание и не отменяет его.

+1

Не может ли это отказаться и от моего последнего запроса? Какова была бы логика, чтобы прервать только запрос, если пользователь все еще печатает? –

+0

Я ответил, прежде чем полностью заполнить ваш пример кода, ответ на отладку выше - лучший способ удовлетворить ваши потребности. –

1

В этом случае вы хотите использовать технику debounce?

см:

+0

Спасибо! Что «размывает»: 0' делать? –

+0

Я скопировал это из документов, может быть не нужно в вашем случае, при выходе из поля у него не будет задержки debounce (потому что это 0), вы можете точно настроить debounce на основе каждого типа события, если хотите – house9

Смежные вопросы