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, Promisedas das aufzurufende onloadEreignis resolve()des iFrames festlegt, das des iFrames festlegt srcund 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 myFuncwird.
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 Promiseabzurufen 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.