Robię testy jednostkowe. Środowisko testowe ładuje stronę do iFrame, a następnie uruchamia potwierdzenia na tej stronie. Przed rozpoczęciem każdego testu tworzę element, Promisektóry ustawia onloadzdarzenie iFrame do wywołania resolve(), ustawia iFrame srci zwraca obietnicę.
Mogę więc po prostu zadzwonić loadUrl(url).then(myFunc)i poczekać na załadowanie strony przed wykonaniem tego, co myFuncjest.
Używam tego rodzaju wzorca w moich testach (nie tylko do ładowania adresów URL), głównie po to, aby umożliwić wprowadzenie zmian w DOM (np. Naśladuj kliknięcie przycisku i czekaj, aż elementy div się ukryją i pokażą).
Wadą tego projektu jest to, że ciągle piszę anonimowe funkcje z kilkoma wierszami kodu. Ponadto, mimo że mam obejście (QUnit assert.async()), funkcja testowa, która definiuje obietnice, kończy się przed uruchomieniem obietnicy.
Zastanawiam się, czy istnieje sposób, aby uzyskać wartość z a Promiselub czekać (blok / uśpienie), aż zostanie rozwiązany, podobnie jak w .NET IAsyncResult.WaitHandle.WaitOne(). Wiem, że JavaScript jest jednowątkowy, ale mam nadzieję, że nie oznacza to, że funkcja nie może dać.
Zasadniczo, czy istnieje sposób na wyplucie wyników we właściwej kolejności?
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)), które mogą znacznie skrócić anons.