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