2015-11-03 4 views
8

Angenommen, ich habe ein Eingabefeld (mehr wie das Google-Suchfeld), das bei einer Änderung eine Anfrage auslöst und einige Ergebnisse anzeigt.AngularJS - Wie man ein Versprechen annulliert?

Zum Beispiel

Lassen Sie uns Typ in Dog im Eingabe:

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. 

Nun lassen Sie uns sagen, dass die DO Antrag später als die DOG ein reagiert. Mein Modell würde mit den DO Ergebnissen enden, selbst wenn ich DOG eintippte.

Dafür brauche ich eine Möglichkeit, aktuelle laufende Anfragen abzubrechen oder abzubrechen, wenn ich weiter Buchstaben eintippe. Auf diese Weise wird mein Modell nur durch die letzte Anfrage geändert.

sieht meine Eingabe wie folgt aus:

<input type="text" class="form-control" data-ng-model="query" data-ng-change="ctrl.search(query)" placeholder="Search" /> 

Hier ist meine 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

Wir können nicht abbrechen promise..either müssen wir 'reject' oder' resolve' um es zu vervollständigen .. –

+1

1) Benutze debounce in deinem Textfeld, du kannst ng-model-options verwenden 2) Du kannst der timeout-Eigenschaft von http options eine Zusage geben Sie können sie abbrechen (indem Sie das zurückgestellte Objekt ablehnen), aber die Anfrage wird weiterhin vom Server verarbeitet und auf Client-Ebene abgelehnt. – PSL

+0

Es wäre wahrscheinlich besser, dies zu lösen, indem die Anfrage überhaupt nicht gesendet wird, bis eine kurze Schreibpause eingetreten ist. Durch das Abbrechen der Anfrage wird der Server nicht daran gehindert, sie zu verarbeiten, wenn sie sie bereits erhalten hat. Sehen Sie sich https://docs.angularjs.org/api/ng/directive/ngModelOptions genauer die Debounce-Option an. –

Antwort

4

Normalerweise verwenden in diesem Fall die Leute ng-model-options={debounce: 100}.

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

trotzdem können Sie versprechen, ablehnen.

+0

Das hat den Trick gemacht! Vielen Dank! Ist das wie eine Verzögerung vor dem Senden jeder Anfrage? –

+0

ja, es hilft dir;) gerne. – Errorpro

+0

@MatiasCicero es ist im Grunde ein Timeout, das jedes Mal zurückgesetzt wird, wenn sich der Wert ändert. Wenn der Wert für 100ms nicht mehr wechselt, wird der Timer beendet und eine Anforderung gesendet. –

0

So: $q.reject(response);

Obwohl technisch glaube ich, dass die oben Kommentator, Sie richtig Ich lehne das Versprechen tatsächlich ab und annulliere es nicht wirklich.

+1

Würde das nicht auch meine letzte Anfrage ablehnen? Was wäre die Logik, nur eine Anfrage abzubrechen, wenn der Benutzer noch tippt? –

+0

Ich antwortete, bevor ich Ihr Codebeispiel vollständig ausgefüllt habe, ist die Entprellungsantwort oben eine bessere Methode, um auf Ihre Bedürfnisse einzugehen. –

1

Ich denke, dass Sie in diesem Fall eine debounce Technik verwenden möchten?

siehe:

+0

Danke! Was "verwischt": 0' tun? –

+0

Ich kopierte das aus den Dokumenten, könnte in Ihrem Fall nicht benötigt werden, beim Verlassen des Feldes würde es nicht die Entprellung Verzögerung haben (weil es 0 ist), können Sie die Entprellung für jeden Ereignistyp Feinabstimmung, falls gewünscht – house9

Verwandte Themen