2016-09-24 10 views
16

के बाहर प्रतीक्षा का उपयोग करके मैं दो एसिंक फ़ंक्शंस को एक साथ श्रृंखला का प्रयास करने का प्रयास कर रहा था, क्योंकि पहले में एक सशर्त वापसी पैरामीटर था जो दूसरे को चलाने के लिए या मॉड्यूल से बाहर निकलने का कारण बना था। हालांकि, मुझे अजीब व्यवहार मिला है जो मुझे चश्मे में नहीं मिल रहा है।एसिंक फ़ंक्शन

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

यह मेरा कोड का एक टुकड़ा bastardized है (यदि आप संपूर्ण संभावना here देख सकते हैं), कि बस की जाँच करता है, तो अगर पहले से ही एक लॉबी में एक खिलाड़ी है, लेकिन यह अप्रासंगिक है।

अगला हमारे पास यह async फ़ंक्शन है।

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

इस समारोह अगर exit === true चलाने की जरूरत नहीं है।

मैं

const inLobby = await isInLobby(); 

यह मैं आशा व्यक्त की परिणाम के लिए इंतजार करेंगे करने की कोशिश की, तो मैं inLobby का उपयोग सशर्त countPlayer चलाने के लिए कर सकते हैं, हालांकि मैं कोई विशिष्ट विवरण के साथ एक लेखन त्रुटि प्राप्त किया।

आप awaitasync फ़ंक्शन के दायरे से बाहर क्यों काम नहीं कर सकते? मुझे पता है कि यह एक चीनी वादा है, इसलिए इसे then पर जंजीर किया जाना चाहिए, लेकिन यह क्यों है कि countPlayer में मैं एक और वादा का इंतजार कर सकता हूं, लेकिन बाहर, मैं awaitisInLobby नहीं कर सकता?

+0

क्या आप हमें दिखा सकते हैं * कहां * आपने इंतजार किया है इनबॉक्स() ', और' इनबॉक्स 'का उपयोग कैसे किया जाता है? साथ ही, 'गिनप्लेयर' कहां/कैसे कहा जाता है? – Bergi

+0

@ बर्गि मैंने वास्तविक संदर्भ के लिए अपने रेपो को जोड़ा। –

+0

प्रश्न में डालने के लिए बहुत अधिक कोड मुझे नहीं पता कि समस्या कहां है (शायद आप पहले ही रेपो अपडेट कर चुके हैं)? यदि आप 'isInLobby() को संदर्भित करते हैं। (... countplayer()। फिर ... 'भाग, समाधान छोटा है: केवल उस फ़ंक्शन को बनाएं जिसमें वे कॉल निहित हैं (' (req, res) => 'one) 'async'। – Bergi

उत्तर

26

शीर्ष स्तर await समर्थित नहीं है। मानक समिति द्वारा कुछ चर्चाएं क्यों की गई हैं, जैसे this Github issue

शीर्ष स्तर का इंतजार क्यों एक बुरा विचार है, इसके बारे में thinkpiece on Github भी है। विशेष रूप से वह पता चलता है कि अगर आप इस तरह कोड है:

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

अब किसी भी फ़ाइल कि data.js आयात करता है जब तक लाने पूरा करता है, अपने मॉड्यूल लोडिंग के इतना सब अब अवरुद्ध है निष्पादित नहीं होंगे। इससे ऐप मॉड्यूल ऑर्डर के बारे में तर्क करना बहुत मुश्किल हो जाता है, क्योंकि हम शीर्ष स्तर जावास्क्रिप्ट को सिंक्रनाइज़ और अनुमानित रूप से निष्पादित करने के लिए उपयोग करते हैं। अगर इसकी अनुमति थी, तो जानना कि एक फ़ंक्शन परिभाषित होने पर मुश्किल हो जाता है।

+0

यह एक अच्छा लिंक है, धन्यवाद। यह शर्म की बात है कि शीर्ष स्तर का समर्थन वहां नहीं है। मैं आशा करती हूं यह है। वर्तमान में यह खड़ा है कि मुझे अपने वादों को घोंसला करना है और यह बहुत बुरा अभ्यास है और मुझे यह पसंद नहीं है। :(धन्यवाद। –

+0

@ स्टर्लिंग आर्चर वैकल्पिक रूप से, एक एसिंक IIFE का उपयोग करें: 'void async फ़ंक्शन() {const inLobby = await isInLobby()}() ' – robertklep

+0

@robertklep उस कार्य में' इन लॉबी 'को स्कोप नहीं करेगा -अकाऊ? –

16

निश्चित रूप से हमेशा इस है:

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

यह async जहां उपयोग कर सकते हैं का इंतजार साथ एक त्वरित समारोह में आता है। यह आपको एसिंक फ़ंक्शन बनाने की आवश्यकता बचाता है जो बहुत अच्छा है! // क्रेडिट्स Silve2611

+0

कृपया आगे विस्तार करें और समझाएं कि यह क्यों काम करता है। –

+2

यह उत्तर देने के लिए बहुत बेवकूफ है। यह एसिंक के साथ एक त्वरित कार्य करता है जहां आप प्रतीक्षा कर सकते हैं। यह आपको एसिंक फ़ंक्शन बनाने की आवश्यकता बचाता है बढ़िया है! – Silve2611

+3

समस्या का समाधान नहीं करता है क्योंकि आपको अभी भी इस अनाम फ़ंक्शन का इंतजार करना होगा, जो फिर से, कार्यों के बाहर से काम नहीं करता है। – Michael

संबंधित मुद्दे