Je fais des tests unitaires. Le framework de test charge une page dans un iFrame, puis exécute des assertions sur cette page. Avant le début de chaque test, je crée un Promise
qui définit l' onload
événement de l'iFrame à appeler resolve()
, définit l'iFrame src
et renvoie la promesse.
Donc, je peux simplement appeler loadUrl(url).then(myFunc)
, et il attendra que la page se charge avant d'exécuter quoi que ce myFunc
soit.
J'utilise ce type de modèle partout dans mes tests (pas seulement pour charger des URL), principalement pour permettre aux modifications du DOM de se produire (par exemple, imiter en cliquant sur un bouton, et attendre que les divs se masquent et s'affichent).
L'inconvénient de cette conception est que j'écris constamment des fonctions anonymes contenant quelques lignes de code. De plus, même si j'ai une solution de contournement (QUnit assert.async()
), la fonction de test qui définit les promesses se termine avant que la promesse ne soit exécutée.
Je me demande s'il existe un moyen d'obtenir une valeur de a Promise
ou d'attendre (bloquer / dormir) jusqu'à ce qu'il soit résolu, similaire à .NET IAsyncResult.WaitHandle.WaitOne()
. Je sais que JavaScript est monothread, mais j'espère que cela ne signifie pas qu'une fonction ne peut pas céder.
En gros, y a-t-il un moyen d'obtenir les résultats suivants pour recracher les résultats dans le bon ordre?
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))
, ce qui peut réduire considérablement les anons.