2016-09-24 28 views
16

İki eşzamansız işlevi birbirine zincirleme girişiminde bulundum çünkü birincisi, ya koşuya neden olan koşullu bir dönüş parametresine sahipti ya da modülden çıktı. Ancak, özelliklerde bulamadığım tuhaf davranışlar buldum.Bir eşzamanlama işlevinin dışında beklemede bekletme

async function isInLobby() { 
    //promise.all([chained methods here]) 
    let exit = false; 
    if (someCondition) exit = true; 
} 

Bu benim kod bastardized snippet'tir bir oyuncu zaten lobide eğer, ama bu alakasız eğer basitçe kontrol ettiğinden, (tam kapsamını here görebilir).

Sonraki bu uyumsuzluğa sahibiz.

async function countPlayer() { 
    const keyLength = await scardAsync(game); 
    return keyLength; 
} 

Bu fonksiyon exit === true eğer çalıştırmak için gerekli değildir. ancak belirli bilgileri içeren bir TypeError aldı

Ben

const inLobby = await isInLobby(); 

Ben sonuçlarına bekliyor ümit Bu yapmaya çalıştım, bu yüzden koşullu countPlayer çalıştırmak için inLobby kullanabilirsiniz.

Neden async işlevinin kapsamı dışında işlev göremiyorsunuz? Bunun bir şeker sözü olduğunu biliyorum, bu yüzden then'a zincirlenmiş olmalı ama neden countPlayer'da başka bir söz bekleyebilirim ama dışarıda awaitisInLobby?

+0

Bize gösterebilir misiniz * nerede * yaptıysanız, isInLobby() 'yi, ve inLobby'yi nasıl kullanırsınız? Ayrıca, "countPlayer" nerede/nasıl aranır? – Bergi

+0

@Bergi Gerçek bağlam için repo'yu bağladım. –

+0

sorusuna koymak için çok fazla kod sorunun nerede olduğunu göremiyorum (belki de repo'yu zaten güncellediniz)? Eğer isInLobby() 'ye başvurursanız o zaman (… countPlayer(). Sonra… 'parçası, çözüm önemsizdir: sadece bu çağrıların içerdiği fonksiyonu yapın (' (req, res) => 'one) "async". – Bergi

cevap

26

Üst düzey await desteklenmez. Standartlar komitesinin neden bu olduğuyla ilgili birkaç tartışma var, örneğin this Github issue. Üst düzey beklemenin neden kötü bir fikir olduğu hakkında bir thinkpiece on Github da var. Senin modül yükleme nedenle tüm engellendi tamamlanana getirme kadar

// data.js 
const data = await fetch('/data.json'); 
export default data; 

Şimdi data.js ithal herhangi dosya yürütmek olmaz: Özellikle o böyle bir kod varsa düşündürmektedir. Bu, uygulama modülü düzeni hakkında akıl yürütmeyi çok zor hale getiriyor, çünkü senkronize ve öngörülebilir bir şekilde çalıştırılan en üst seviyedeki Javascript kullanıyoruz. Eğer buna izin verilirse, bir fonksiyon tanımlandığında ne zaman karar vermesi zorlaşır.

+0

Bu iyi bir bağlantı, teşekkürler. Utanç verici bir üst düzey destek yok. Umarım öyledir. Şu anda olduğu gibi, sözlerimi burada barındırmalıyım ve bu çok kötü bir uygulama ve bunu sevmiyorum. :(Teşekkür ederiz. –

+0

@SterlingArcher alternatif olarak, bir async IIFE kullanın: void async function() {const inLobby = bekle isInLobby()}() ' – robertklep

+0

@robertklep, 'inLobby' işlevini non -kullanılabilir? –

16

elbette her zaman bu vardır:

(async() => { 
    await ... 
})(); 

Bu kullanmayı bekliyor olabilir zaman uyumsuz ile hızlı bir işlev yapar. Bu harika bir uyumsuzluk fonksiyonu yapma ihtiyacını kurtarır! // krediler Silve2611

+0

Lütfen bunu daha ayrıntılı bir şekilde açıklayın ve bunun neden işe yaradığını açıklayın: –

+2

bu yanıtı aşağıya vurmak için çok aptalcadır.Ayrıca, beklemeyi kullanabileceğiniz async ile hızlı bir işlev yapar. harika! – Silve2611

+3

Sorunu çözmüyorsanız, yine de bu anonim işlevi hala beklemeniz gerekiyor, bu da işlevlerin dışında çalışmıyor. – Michael