Ist es möglich, ein verzögertes Objekt direkt mit AJAX zu erstellen und zu verwenden?
-
21-12-2019 - |
Frage
Ich habe eine Anwendung, die einige AJAX-Anfragen sendet, wenn ein Benutzer auf eine bestimmte Schaltfläche klickt.
Allerdings habe ich auch so etwas wie einen „Abbrechen“-Button, der alle Anfragen abbrechen soll.
Ich benutze $.when
ist derzeit für die Bearbeitung aller gesendeten Anfragen zuständig, wobei entsprechende Rückrufe hinzugefügt werden Promise
Objekt, das es zurückgibt.
Allerdings ist die Tatsache, dass $.when
gibt a zurück Promise
Objekt ist frustrierend, da es die Methoden (absichtlich) nicht enthält Deferred
muss die Anfragen steuern, wie mit diesem Code gezeigt:
Verwendung von $.when
var x = $.when($.get('/'), $.get('/')); // .then(function() {console.log('done');});
Object.keys(x);
// ["state", "always", "then", "promise", "pipe", "done", "fail", "progress"]
Verwendung einer AJAX-Anfrage (jqXHR implementiert die Deferred-Schnittstelle)
var x = $.get('/');
Object.keys(x);
// ["readyState", "getResponseHeader", "getAllResponseHeaders", "setRequestHeader", "overrideMimeType", "statusCode", "abort", "state", "always", "then", "promise", "pipe", "done", "fail", "progress", "complete", "success", "error"]
Ich suche nach einer Möglichkeit, das abzurufen Deferred
widersprechen oder ersetzen $.when
mit einer Methode, die das Gleiche ausführt, aber a zurückgibt Deferred
Objekt stattdessen.Von dort aus kann ich eine geeignete Ablehnungs-/Abbruchmethode aufrufen.
Ist das möglich?
Lösung
Sie können die Anfragen in einem Array zusammenfassen und sie bei Bedarf einzeln abbrechen.
Hierfür können Sie verwenden .apply
An $.when
.Zum Beispiel:
var requests = [$.get('/'), $.get('/')];
$.when.apply($,requests).then(function(res1,res2){
//access results here
});
// aborting:
requests.forEach(function(x){ return x.abort();});
Zurückgestellte Objekte werden nur zum Erstellen von Versprechen aus Callback-APIs verwendet.Sie können das zurückgestellte Objekt eines bereits vorhandenen Versprechens nicht „abrufen“.Erstellen Sie damit nur neue.
Vielleicht möchten Sie auch bei Domenic vorbeischauen last()
.