Erstellen Sie ein (ES6) Versprechen, ohne es zu lösen
Verwendung von ES6 verspricht,, wie erstelle ich ein Versprechen ohne Definition der Logik für die Lösung? Hier ist ein einfaches Beispiel (einige Typoskript):
var promises = {};
function waitFor(key: string): Promise<any> {
if (key in promises) {
return promises[key];
}
var promise = new Promise(resolve => {
//But I don't want to try resolving anything here :(
});
promises[key] = promise;
return promise;
}
function resolveWith(key: string, value: any): void {
promises[key].resolve(value); //Not valid :(
}
Es ist leicht getan, mit anderen Versprechen Bibliotheken. JQuery Beispiel:
var deferreds = {};
function waitFor(key: string): Promise<any> {
if (key in promises) {
return deferreds[key].promise();
}
var def = $.Deferred();
deferreds[key] = def;
return def.promise();
}
function resolveWith(key: string, value: any): void {
deferreds[key].resolve(value);
}
Nur so kann ich sehen, dies zu tun wäre, um zu speichern die lösen-Funktion entfernt irgendwo in die Versprechen der Testamentsvollstrecker aber das scheint chaotisch, und ich bin nicht sicher, es ist festgelegt, Wann genau diese Funktion ausgeführt wird - wird es immer ausgeführt, unmittelbar auf dem Bau?
Dank.
InformationsquelleAutor der Frage Barguast | 2015-06-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gute Frage!
Den resolver, der an die Versprechen Konstruktor absichtlich läuft synchron zur Unterstützung dieser Anwendungsfall:
Dann zu einem späteren Zeitpunkt:
Dem Grund das Versprechen Konstruktor gegeben wird, ist, dass:
Manchmal es passt nicht und für dass es den der resolver läuft synchron. Hier ist weitere Lektüre zu dem Thema.
InformationsquelleAutor der Antwort Benjamin Gruenbaum
Möchte ich hinzufügen meine 2 Cent hier. Angesichts genau dieser Frage "Erstellen eines es6 Versprechen, ohne es zu lösen" ich löste es, erstellen Sie eine wrapper-Funktion und der Aufruf der wrapper-Funktion statt. Code:
Sagen wir, wir haben eine Funktion
f
gibt ein VersprechenNun, ich will vorbereiten einen Anruf zu
f('hello', 42)
ohne tatsächlich die Lösung:Hoffe, dies hilft jemand 🙂
Verweisen auf
Promise.all()
als fragte in den Kommentaren (und beantwortet von @Joe Frambach), wenn ich wollen vorbereiten einen Anruf zuf1('super')
&f2('rainbow')
- 2-Funktionen, die Rückkehr verspricht -InformationsquelleAutor der Antwort Manu
Wie wäre es mit einem umfassenderen Ansatz?
Könnten Sie schreiben Sie einen Konstruktor, der gibt ein neues Versprechen, verziert mit
.resolve()
und.reject()
Methoden.Würden Sie wahrscheinlich wählen, um den Namen des Konstruktors
Deferred
- ein Begriff mit viel Vorrang bei [der Geschichte von] javascript verspricht.Durch Rücksendung der verzierten promsie eher als ein schlichtes Objekt, all das Versprechen die natürlichen Eigenschaften/Methoden verfügbar bleiben, zusätzlich zu den Dekorationen.
Auch, durch den Umgang mit
fn
der offenbarer Muster bleibt verfügbar, sollten Sie benötigen/verwenden, wählen Sie es auf eine Latente.DEMO
Nun, mit der
Deferred()
- Dienstprogramm wird Ihr code ist praktisch identisch mit dem jQuery-Beispiel.InformationsquelleAutor der Antwort Roamer-1888