Я делаю некоторые модульные тесты. Тестовая среда загружает страницу в iFrame, а затем запускает утверждения против этой страницы. Перед началом каждого теста я создаю Promise
, который устанавливает событие iFrame onload
для вызова resolve()
, устанавливает iFrame src
и возвращает обещание.
Итак, я могу просто позвонить loadUrl(url).then(myFunc)
, и он будет ожидать загрузки страницы, прежде чем выполнять myFunc
.
Я использую этот тип шаблонов во всех своих тестах (не только для загрузки URL-адресов), в первую очередь для того, чтобы позволить изменениям в DOM (например, имитировать нажатие кнопки и ждать, пока divs будут скрыты и показываться).
Недостатком этого дизайна является то, что я постоянно пишу анонимные функции с несколькими строками кода в них. Кроме того, пока у меня есть работа (QUnit assert.async()
), тестовая функция, которая определяет promises, завершается до того, как обетование будет запущено.
Мне интересно, есть ли способ получить значение из Promise
или ждать (блокировать/спящий режим) до его разрешения, аналогично .NET IAsyncResult.WaitHandle.WaitOne()
. Я знаю, что JavaScript однопоточный, но я надеюсь, что это не значит, что функция не может уступить.
В сущности, есть ли способ получить следующее, чтобы выплевывать результаты в правильном порядке?
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>