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 Promisequi définit l' onloadévénement de l'iFrame à appeler resolve(), définit l'iFrame srcet 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 myFuncsoit.
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 Promiseou 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.