Ich mache einige Unit-Tests. Das Testframework lädt eine Seite in einen iFrame und führt dann Zusicherungen für diese Seite aus. Bevor jeder Test beginnt, erstelle ich ein Ereignis, Promise
das das aufzurufende onload
Ereignis resolve()
des iFrames festlegt, das des iFrames festlegt src
und das Versprechen zurückgibt.
Ich kann also einfach anrufen loadUrl(url).then(myFunc)
und es wird warten, bis die Seite geladen ist, bevor etwas ausgeführt myFunc
wird.
Ich verwende diese Art von Muster überall in meinen Tests (nicht nur zum Laden von URLs), hauptsächlich, um Änderungen am DOM zuzulassen (z. B. das Klicken auf eine Schaltfläche nachahmen und darauf warten, dass Divs ausgeblendet und angezeigt werden).
Der Nachteil dieses Designs ist, dass ich ständig anonyme Funktionen mit ein paar Codezeilen schreibe. Während ich eine Problemumgehung (QUnit assert.async()
) habe, wird die Testfunktion, die die Versprechen definiert, abgeschlossen, bevor das Versprechen ausgeführt wird.
Ich frage mich, ob es eine Möglichkeit gibt, einen Wert von a Promise
abzurufen oder zu warten (block / sleep), bis er aufgelöst ist, ähnlich wie bei .NET IAsyncResult.WaitHandle.WaitOne()
. Ich weiß, dass JavaScript Single-Threaded ist, aber ich hoffe, dass dies nicht bedeutet, dass eine Funktion nicht nachgeben kann.
Gibt es im Wesentlichen eine Möglichkeit, die folgenden Ergebnisse in der richtigen Reihenfolge auszuspucken?
function kickOff() {
return new Promise(function(resolve, reject) {
$("#output").append("start");
setTimeout(function() {
resolve();
}, 1000);
}).then(function() {
$("#output").append(" middle");
return " end";
});
};
function getResultFrom(promise) {
// todo
return " end";
}
var promise = kickOff();
var result = getResultFrom(promise);
$("#output").append(result);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="output"></div>
.then(fnAppend.bind(myDiv))
z. B. , die Anonen erheblich reduzieren können.