Sto facendo qualche test unitario. Il framework di test carica una pagina in un iFrame e quindi esegue asserzioni su quella pagina. Prima di iniziare ogni test, creo un Promise
che imposta l'evento onload
dell'iFrame per chiamare , imposta src
dell'Iframe e restituisce la promessa.Come attendere la risoluzione di una promessa JavaScript prima di riprendere la funzione?
Quindi, posso semplicemente chiamare loadUrl(url).then(myFunc)
e attenderà che la pagina venga caricata prima di eseguire qualsiasi cosa sia myFunc
.
Uso questo tipo di modello in tutti i punti dei test (non solo per il caricamento degli URL), principalmente per consentire modifiche al DOM (ad esempio, fare clic su un pulsante e attendere che div si nascondano e mostrare).
Il lato negativo di questo design è che sto scrivendo costantemente funzioni anonime con poche righe di codice al loro interno. Inoltre, mentre ho un work-around (QUnit's assert.async()
), la funzione di test che definisce le promesse viene completata prima dell'esecuzione della promessa.
Mi chiedo se esiste un modo per ottenere un valore da Promise
o attendere (blocco/sospensione) finché non viene risolto, in modo simile a .NET IAsyncResult.WaitHandle.WaitOne()
. So che JavaScript è single-threaded, ma spero che ciò non significhi che una funzione non può 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>
se si inseriscono le chiamate in append in una funzione riutilizzabile, è quindi possibile() come necessario per ASCIUGARE. puoi anche creare gestori multi-purpose, guidati da _questo_ per alimentare le chiamate then(), come '.then (fnAppend.bind (myDiv))', che può ridurre enormemente gli anon. – dandavis
Con cosa stai provando? Se è un browser moderno o puoi usare uno strumento come BabelJS per trascrivere il tuo codice, questo è certamente possibile. –