Dies ist kein Problem der realen Welt, ich versuche nur zu verstehen, wie Versprechen geschaffen werden.
Ich muss verstehen, wie man ein Versprechen für eine Funktion macht, die nichts zurückgibt, wie setTimeout.
Angenommen, ich habe:
function async(callback){
setTimeout(function(){
callback();
}, 5000);
}
async(function(){
console.log('async called back');
});
Wie erstelle ich ein Versprechen, async
das zurückkehren kann, nachdem das setTimeout
bereit ist callback()
?
Ich nahm an, dass es mich irgendwohin bringen würde:
function setTimeoutReturnPromise(){
function promise(){}
promise.prototype.then = function() {
console.log('timed out');
};
setTimeout(function(){
return ???
},2000);
return promise;
}
Aber ich kann nicht darüber hinaus denken.
javascript
settimeout
promise
Laggingreflex
quelle
quelle
async function async(){...}
Antworten:
Update (2017)
Hier sind 2017 Versprechen in JavaScript integriert, sie wurden durch die ES2015-Spezifikation hinzugefügt (Polyfills sind für veraltete Umgebungen wie IE8-IE11 verfügbar). Die Syntax verwendet einen Rückruf, den Sie an den
Promise
Konstruktor (denPromise
Executor ) übergeben, der die Funktionen zum Auflösen / Ablehnen des Versprechens als Argumente erhält.Erstens, da es
async
jetzt eine Bedeutung in JavaScript hat (obwohl es in bestimmten Kontexten nur ein Schlüsselwort ist), werde ich eslater
als Namen der Funktion verwenden, um Verwirrung zu vermeiden.Grundverzögerung
Mit einheimischen Versprechungen (oder einer originalgetreuen Polyfüllung) würde es so aussehen:
Beachten Sie, dass das setzt voraus , eine Version ,
setTimeout
das ist kompatibel mit der Definition für Browser , wosetTimeout
keine Argumente an die Callback übergeben wird , wenn man sich nach der Pause geben (dies ist nicht in Nicht-Browser - Umgebungen wahr sein kann, und nicht genutzt werden wahr auf Firefox, aber jetzt; es ist wahr auf Chrome und sogar zurück auf IE8).Grundverzögerung mit Wert
Wenn Sie möchten, dass Ihre Funktion optional einen Auflösungswert in einem vage modernen Browser
setTimeout
übergibt, in dem Sie nach der Verzögerung zusätzliche Argumente angeben und diese beim Aufruf an den Rückruf übergeben können, können Sie dies tun (aktuelles Firefox und Chrome; IE11 +) , vermutlich Edge; nicht IE8 oder IE9, keine Ahnung von IE10):Wenn Sie die Pfeilfunktionen ES2015 + verwenden, kann dies präziser sein:
oder auch
Stornierbare Verzögerung mit Wert
Wenn Sie das Timeout stornieren möchten, können Sie nicht einfach ein Versprechen von zurückgeben
later
, da Versprechen nicht storniert werden können.Wir können jedoch problemlos ein Objekt mit einer
cancel
Methode und einem Accessor für das Versprechen zurückgeben und das Versprechen beim Abbrechen ablehnen:Live-Beispiel:
Ursprüngliche Antwort von 2014
Normalerweise haben Sie eine Versprechensbibliothek (eine, die Sie selbst schreiben, oder eine der mehreren da draußen). Diese Bibliothek hat normalerweise ein Objekt, das Sie erstellen und später "auflösen" können, und dieses Objekt hat ein "Versprechen", das Sie von ihm erhalten können.
Dann
later
würde es ungefähr so aussehen:In einem Kommentar zu der Frage fragte ich:
und du sagtest
Um dieses Verständnis zu erleichtern, finden Sie hier ein sehr einfaches Beispiel, das nicht im entferntesten Promises-A-konform ist: Live Copy
quelle