Estoy haciendo algunas pruebas unitarias. El marco de prueba carga una página en un iFrame y luego ejecuta afirmaciones en esa página. Antes de que comience cada prueba, creo un Promise
que establece el onload
evento del iFrame para llamar resolve()
, establece el iFrame src
y devuelve la promesa.
Entonces, puedo simplemente llamar loadUrl(url).then(myFunc)
, y esperará a que se cargue la página antes de ejecutar lo que myFunc
sea.
Utilizo este tipo de patrón en todas partes en mis pruebas (no solo para cargar URLs), principalmente para permitir que ocurran cambios en el DOM (por ejemplo, imitar al hacer clic en un botón y esperar a que los divs se oculten y muestren).
La desventaja de este diseño es que constantemente escribo funciones anónimas con algunas líneas de código en ellas. Además, aunque tengo una solución alternativa (QUnit assert.async()
), la función de prueba que define las promesas se completa antes de que se ejecute la promesa.
Me pregunto si hay alguna forma de obtener un valor de a Promise
o esperar (bloquear / dormir) hasta que se resuelva, similar a .NET IAsyncResult.WaitHandle.WaitOne()
. Sé que JavaScript es de un solo subproceso, pero espero que eso no signifique que una función no pueda ceder.
En esencia, ¿hay alguna manera de obtener lo siguiente para escupir los resultados en el orden correcto?
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))
, que pueden reducir enormemente los anones.