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, Promise
który ustawia onload
zdarzenie iFrame do wywołania resolve()
, ustawia iFrame src
i zwraca obietnicę.
Mogę więc po prostu zadzwonić loadUrl(url).then(myFunc)
i poczekać na załadowanie strony przed wykonaniem tego, co myFunc
jest.
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 Promise
lub 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.