Sto facendo dei test unitari. Il framework di test carica una pagina in un iFrame e quindi esegue le asserzioni su quella pagina. Prima dell'inizio di ogni test, creo un messaggio Promise
che imposta l' onload
evento dell'iFrame da chiamare resolve()
, imposta l'iFrame src
e restituisce la promessa.
Quindi, posso semplicemente chiamare loadUrl(url).then(myFunc)
e aspetterà il caricamento della pagina prima di eseguire qualunque cosa myFunc
sia.
Uso questo tipo di pattern dappertutto nei miei test (non solo per caricare gli URL), principalmente per consentire modifiche al DOM (ad es. Mimare il clic su un pulsante e attendere che i div vengano nascosti e mostrati).
Lo svantaggio di questo design è che scrivo costantemente funzioni anonime con poche righe di codice. Inoltre, anche se ho un work-around (QUnit's assert.async()
), la funzione di test che definisce le promesse viene completata prima che la promessa venga eseguita.
Mi chiedo se esiste un modo per ottenere un valore da a Promise
o attendere (blocco / sospensione) finché non si è risolto, in modo simile a .NET IAsyncResult.WaitHandle.WaitOne()
. So che JavaScript è a thread singolo, ma spero che ciò non significhi che una funzione non possa produrre.
In sostanza, c'è un modo per ottenere quanto segue per sputare i risultati nell'ordine corretto?
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))
, che possono ridurre notevolmente le anonime.