Я провожу модульное тестирование. Платформа тестирования загружает страницу в iFrame, а затем выполняет утверждения для этой страницы. Перед началом каждого теста я создаю объект, Promise
который устанавливает onload
событие iFrame для вызова resolve()
, устанавливает iFrame src
и возвращает обещание.
Итак, я могу просто позвонить loadUrl(url).then(myFunc)
, и он будет ждать загрузки страницы перед выполнением того, что myFunc
есть.
Я использую этот вид шаблонов повсюду в своих тестах (не только для загрузки URL-адресов), в первую очередь для того, чтобы позволить изменениям в DOM (например, имитировать нажатие кнопки и ждать, пока div скрываются и отображаются).
Обратной стороной этого дизайна является то, что я постоянно пишу анонимные функции с несколькими строками кода в них. Кроме того, хотя у меня есть обходной путь (QUnit's assert.async()
), тестовая функция, которая определяет обещания, завершается до того, как обещание будет выполнено.
Мне интересно, есть ли способ получить значение из a 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>
.then(fnAppend.bind(myDiv))
, которые могут значительно сократить количество анонов.