Bazı birim testleri yapıyorum. Test çerçevesi bir sayfayı iFrame'e yükler ve ardından o sayfaya karşı iddiaları çalıştırır. Her test başlamadan önce Promise
, iFrame'in onload
olayını çağıracak resolve()
, iFrame'leri ayarlayan src
ve sözü veren bir tane oluşturuyorum.
Yani, sadece arayabilirim loadUrl(url).then(myFunc)
ve ne myFunc
olduğunu çalıştırmadan önce sayfanın yüklenmesini bekleyecek .
Bu tür bir kalıbı testlerimin her yerinde kullanıyorum (sadece URL'leri yüklemek için değil), öncelikle DOM'da değişiklik yapılmasına izin vermek için (örneğin, bir düğmeyi tıklatmayı taklit edin ve div'lerin gizlenmesini ve gösterilmesini bekleyin).
Bu tasarımın dezavantajı, sürekli olarak birkaç satır kod içeren anonim işlevler yazıyor olmam. Dahası, bir çözümüm (QUnit'ler assert.async()
) varken , vaatleri tanımlayan test işlevi vaat yerine getirilmeden önce tamamlanır.
Promise
NET'lere benzer şekilde çözülene kadar a'dan bir değer almanın veya beklemenin (blok / uyku) bir yolu olup olmadığını merak ediyorum IAsyncResult.WaitHandle.WaitOne()
. JavaScript'in tek iş parçacıklı olduğunu biliyorum, ancak umarım bu bir işlevin veremeyeceği anlamına gelmez.
Özünde, sonuçları doğru sırayla bildirmek için aşağıdakileri elde etmenin bir yolu var mı?
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))
anonları büyük ölçüde azaltabilir.