2010-12-03 24 views
9

JavaScript'te bir işlevi yazmalıyım, bu durum eşzamansız bir işlevi çağırmak için durumu döndürür. Ancak, arayan sadece değeri alır ve geri arama fonksiyonu sağlanamaz. ...JavaScript'te eşzamansız işlevler nasıl engellenir

Herhangi fikirleri Ancak

function getState() { 
    var ret = null; 
    asyncCall("request", 
     function() { ret = "foo"; } // callback 
    ); 
    while (ret === null) 
     ; // block on the asynchronous call 
    return ret; 
} 

, döngü asla sona ermeyecek: Ben böyle bir şey denediniz mi? Teşekkür ederim.

+2

Senkronize olmayan çağrıyı neden ilk sırada engellemek istiyorsunuz? Bunu yapmak hiç mantıklı değil. – Tomalak

+1

@Tomolak: Firefox tarafından sağlanan bir çağrı olduğu için değiştiremiyorum. En çok milisaniye alması bekleniyor, bunun için tüm diğer kodlarımı sadece tekrar etmek istemiyorum. –

+0

'getState()' çağıran işlevi yayınlayabilir misiniz? – Tomalak

cevap

8

Sana Size, yazdığın aynen sevdiği zaman uyumsuz kodunu "düzenlemelerine" öyle DİKKAT sağlar http://stratifiedjs.org , StratifiedJS aradığınız düşünüyorum senkron kodu gibi "yazıyor" , uygulamanızın geri kalanını engellemez. apollo js kütüphanesini yükleyerek her yerde kullanabilirsiniz. http://onilabs.com/modules#http

function getState() { 
    return http.get("request"); 
} 
+0

Bu, harici bir ayrıştırıcıya dayanmasına rağmen, burada en iyi çözüm gibi görünüyor. –

+0

Yapıyor. Fakat büyük planda, fazla yük getirmez. – tomg

0

Neden sadece:

asyncCall("request", function() { 
    // here you can inspect the state 
}); 

sarıcı fonksiyonunun ne anlamı var?

Asenkron işlevler bu şekilde çalışır. Eğer yürütülmesine engellemek istiyorsanız, o zaman bir senkron çağrı kullanın:

var state = syncCall("request"); 
+0

Birkaç platformda çalıştığım için bir kütüphane gibi bir şey. Ve kodun geri kalanı bu özel bilgi parçasını beklemek zorunda. Senkronize ikame yoktur. –

+0

@ryanli Ardından, kodun geri kalanını geri aramada bırakın. –

+1

@ Šime: Yani asenkron çağrılar diğer tüm kodları arayarak arayabilir? Sadece bu async çağrılarını engellemenin bir yolu olup olmadığını bilmek istiyorum. –

1

iyi sen geri arama işlevi içine çağrıda istediğiniz mantığı koymak olacaktır. Bunu yapamayacağın bir sebep var mı? onun iyi bir fikir değil yapmak çok ne yapmaya çalışıyoruz bir senkron çagrısıdır

+0

Normal belge JavaScript değil, bir uzantı yazıyorum. İşlevin kalan kısmı bu duruma dayanır ve sağlanan tek şey eşzamansız bir işlevdir. –

1

Ben yanlış sürece:

function getState() { 
    waitfor (var ret) { 
    // block on the asynchronous call 
    asyncCall("request", resume); 
    } 
    return ret; 
} 

elbette sadece şuna benzer kılacak modüller/kütüphaneler vardır:

Bu

o Tabakalı JavaScript gibi görünecektir nasıl Sorunuz, jQuery'nin ajaxStop() olayına bakabiliriz - http://api.jquery.com/ajaxstop. Bu, tüm ajax çağrıları tamamlanana kadar engeller. Bu açıkça, tüm async çağrılarınızın jQuery'den yapılmasını gerektirir.

$(document).ajaxStop(function() { 
    // do your "ajax dependent" stuff here 
});