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 onloadolayını çağıracak resolve(), iFrame'leri ayarlayan srcve sözü veren bir tane oluşturuyorum.
Yani, sadece arayabilirim loadUrl(url).then(myFunc)ve ne myFuncolduğ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.
PromiseNET'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.