Verwenden Sie Versprechen, zu warten, bis Sie abgefragt Bedingung erfüllt ist
Brauche ich zum erstellen einer JavaScript Versprechen, dass wird erst aufgelöst, wenn eine bestimmte Bedingung wahr ist. Sagen wir, ich habe eine 3rd-party-Bibliothek, und ich muss warten, bis eine bestimmte Daten-Bedingung innerhalb dieser Bibliothek.
Dem Szenario, das ich bin daran interessiert, eine ist, wo es keine Möglichkeit gibt zu wissen, Wann diese Bedingung erfüllt ist, andere als einfach abrufen.
Ich kann ein Versprechen, dass wartet auf Sie - und dieser code funktioniert, aber gibt es eine bessere oder genauere Ansatz zu diesem problem?
function ensureFooIsSet() {
return new Promise(function (resolve, reject) {
waitForFoo(resolve);
});
}
function waitForFoo(resolve) {
if (!lib.foo) {
setTimeout(waitForFoo.bind(this, resolve), 30);
} else {
resolve();
}
}
Verwendung:
ensureFooIsSet().then(function(){
...
});
Ich würde normalerweise für die Umsetzung einer max poll-Zeit, aber wollte nicht, dass das cloud-Thema geht es hier.
- Das sieht OK. Sie nicht wirklich brauchen, um verschmutzen der externe Bereich mit waitForFoo aber es ist ein detail und hängt den rest des Codes. Verwenden Sie native verspricht oder eine bestimmte Bibliothek ?
- vereinbart - dies ist nur ein Ausschnitt der gesamte code. Dies würde den Einsatz von nativen Versprechen. Ich habe diese Muster kommen eine Zeit oder zwei und interessiert, ob es einen besseren Weg, um die Struktur dieser.
- Ein einfacher Ansatz wäre, zu widersprechen.beachten Sie die library-Objekt
- sehr schön. Ich hatte gehofft, für etwas wie das. Je nach browser-Anforderungen, die ich möglicherweise nicht in der Lage, es zu benutzen, aber das ist ein guter Tipp.
- Gut, dann polyfill es in älteren Browsern.
- github.com/allain/promise-poll/blob/master/index.js - enthält polyfil
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine kleine variation wäre die Verwendung eines namens IIFE so, dass Ihr code ist ein wenig kürzer und vermeidet das verschmutzen der äußere Umfang:
Gut, mit, dass
waitForFoo
Funktion brauchen Sie nicht eine anonyme Funktion, in der der Konstruktor an alle:Zur Vermeidung der Verschmutzung der Rahmen, ich würde empfehlen, entweder wickeln Sie beide in einer IIFE oder verschieben
waitForFoo
- Funktion in derensureFooIsSet
Umfang:Alternativ zu vermeiden, die Bindung, die erforderlich ist, um übergeben, um
resolve
undreject
Sie bewegen könnte, es in derPromise
Konstruktor callback wie @DenysSéguret vorgeschlagen.Wie @BenjaminGruenbaum kommentiert, Sie konnte sehen das
.foo
Eigenschaft zugeordnet werden, z.B. über eine setter:Können Sie es verwenden, wie
waitFor(lib, "foo", 5000)
.