Saya melakukan beberapa pengujian unit. Framework pengujian memuat halaman ke dalam iFrame, lalu menjalankan pernyataan pada halaman tersebut. Sebelum setiap tes dimulai, saya membuat Promise
yang menetapkan acara iFrame onload
untuk dipanggil resolve()
, menyetel iFrame src
, dan mengembalikan janji.
Jadi, saya bisa menelepon loadUrl(url).then(myFunc)
, dan itu akan menunggu halaman dimuat sebelum mengeksekusi apa pun myFunc
.
Saya menggunakan pola semacam ini di semua tempat dalam pengujian saya (tidak hanya untuk memuat URL), terutama untuk memungkinkan perubahan pada DOM terjadi (misalnya meniru mengklik tombol, dan menunggu div bersembunyi dan ditampilkan).
Kelemahan dari desain ini adalah saya terus-menerus menulis fungsi anonim dengan beberapa baris kode di dalamnya. Lebih lanjut, sementara saya memiliki work-around (QUnit's assert.async()
), fungsi pengujian yang mendefinisikan promise selesai sebelum promise dijalankan.
Saya bertanya-tanya apakah ada cara untuk mendapatkan nilai dari a Promise
atau tunggu (blokir / tidur) hingga terselesaikan, mirip dengan .NET IAsyncResult.WaitHandle.WaitOne()
. Saya tahu JavaScript adalah single-threaded, tetapi saya berharap itu tidak berarti bahwa suatu fungsi tidak dapat menghasilkan.
Intinya, adakah cara agar yang berikut ini memberikan hasil dalam urutan yang benar?
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))
, yang dapat sangat mengurangi anon.