Wie Sie warten, bis der JavaScript-Versprechen zu beheben, bevor Sie die Funktion wieder aufnimmt?

Mache ich einige unit-Tests. Das test-framework lädt eine Seite in einem iFrame und läuft dann Behauptungen gegen die Seite. Vor jedem test beginnt, erstelle ich ein Promise wird der iFrame ist onload Ereignis aufrufen resolve() ist, setzt das iFrame -src, und gibt das Versprechen.

So, ich kann nur rufen loadUrl(url).then(myFunc), und wird es warten, bis die Seite geladen ist, bevor Sie ausgeführt wird, was myFunc ist.

Ich diese Art von Muster ganz über dem Platz in meinen tests (nicht nur für das laden von URLs), in Erster Linie, um zu erlauben, änderungen an der DOM zu passieren (z.B. imitieren klicken auf eine Schaltfläche und warten Sie, bis divs ein-und ausblenden).

Der Nachteil dieser Konstruktion ist, dass ich ständig schreiben anonyme Funktionen mit ein paar Zeilen code in Ihnen. Weiter, während ich einen work-around (QUnit ist assert.async()), die test-Funktion, die definiert, die Versprechen, die abgeschlossen wird, bevor der Verheißung führen.

Frage ich mich, ob es irgendeinen Weg gibt, um einen Wert aus einer Promise oder warten (block/sleep), bis es sich aufgelöst hat, ähnlich .NET IAsyncResult.WaitHandle.WaitOne(). Ich weiß, JavaScript ist single-threaded, aber ich hoffe, dass bedeutet nicht, dass eine Funktion nicht nachgeben.

Im wesentlichen, ist es ein Weg, um die folgenden ausspucken Ergebnisse in der richtigen Reihenfolge?

JS:

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);

HTML:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="output"></div>

  • wenn Sie die append-Aufrufe in eine wiederverwendbare Funktion, können Sie dann (), wie erforderlich, um zu TROCKNEN. Sie können auch multi-purpose-Handler, gelenkt von diesen zu ernähren, dann () - Aufrufe, wie .then(fnAppend.bind(myDiv)), das kann zu einer erheblichen Senkung der anons.
  • Was du testen mit? Wenn es einen modernen browser, oder Sie können verwenden Sie ein tool wie BabelJS zu transpile Ihr code ist dies sicherlich möglich.
InformationsquelleAutor dx_over_dt | 2015-03-07
Schreibe einen Kommentar