आपके द्वारा वर्णित समस्या दो-गुना है।
- आपके द्वारा लिखा गया कार्यक्रम बाहर से देखने पर अतुल्यकालिक रूप से एक पूरे के रूप में व्यवहार करना चाहिए ।
- यह कॉल साइट पर दिखाई नहीं देना चाहिए कि क्या कोई फ़ंक्शन कॉल संभावित रूप से नियंत्रण देता है या नहीं।
इसे प्राप्त करने के कुछ तरीके हैं, लेकिन वे मूल रूप से उबालते हैं
- कई धागे (अमूर्त के कुछ स्तर पर)
- भाषा के स्तर पर कई प्रकार के कार्य होते हैं, जिन्हें सभी इस तरह कहते हैं
foo(4, 7, bar, quux)
।
(1) के लिए, मैं कई प्रक्रियाओं को फोर्क और रन कर रहा हूं, कई कर्नेल थ्रेड्स, और हरे रंग के थ्रेड कार्यान्वयन को चलाया जा रहा है, जो कर्नेल थ्रेड्स पर भाषा-रनटाइम स्तर थ्रेड शेड्यूल करता है। समस्या के दृष्टिकोण से, वे समान हैं। इस दुनिया में, कोई भी फ़ंक्शन कभी भी अपने धागे के परिप्रेक्ष्य से नियंत्रण नहीं छोड़ता है या खो देता है । धागा ही कभी कभी नियंत्रण नहीं है और कभी कभी नहीं चल रहा है, लेकिन आप इस दुनिया में अपने स्वयं के धागे का नियंत्रण नहीं देते। इस मॉडल को फिट करने वाले एक सिस्टम में नए थ्रेड्स को स्पॉन करने या मौजूदा थ्रेड्स में शामिल होने की क्षमता हो सकती है या नहीं। इस मॉडल को फिट करने वाली प्रणाली में यूनिक्स की तरह एक धागे की नकल करने की क्षमता हो सकती है या नहीं हो सकती है fork
।
(२) दिलचस्प है। इसे न्याय करने के लिए हमें परिचय और उन्मूलन रूपों के बारे में बात करने की आवश्यकता है।
मैं यह दिखाने जा रहा हूं कि क्यों await
जावास्क्रिप्ट को जावास्क्रिप्ट की तरह किसी भाषा में पीछे-संगत तरीके से नहीं जोड़ा जा सकता है। मूल विचार यह है कि उपयोगकर्ता को वादों को उजागर करने और तुल्यकालिक और अतुल्यकालिक संदर्भों के बीच अंतर होने से, जावास्क्रिप्ट ने एक कार्यान्वयन विवरण लीक किया है जो तुल्यकालिक और अतुल्यकालिक कार्यों को समान रूप से संभालने से रोकता है। यह भी तथ्य है कि आप await
एक async फ़ंक्शन बॉडी के बाहर एक वादा नहीं कर सकते । ये डिज़ाइन विकल्प "कॉल करने वाले के लिए अतुल्यकालिकता को अदृश्य बनाने" के साथ असंगत हैं।
आप एक लैम्ब्डा का उपयोग करके एक तुल्यकालिक फ़ंक्शन का परिचय कर सकते हैं और इसे फ़ंक्शन कॉल के साथ समाप्त कर सकते हैं।
सिंक्रोनस फ़ंक्शन परिचय:
((x) => {return x + x;})
तुल्यकालिक समारोह उन्मूलन:
f(4)
((x) => {return x + x;})(4)
आप इसे अतुल्यकालिक फ़ंक्शन परिचय और उन्मूलन के साथ विपरीत कर सकते हैं।
अतुल्यकालिक फ़ंक्शन परिचय
(async (x) => {return x + x;})
असिंक्रोनस फंक्शन एलिमिनेशन (नोट: केवल एक async
फंक्शन के अंदर ही मान्य )
await (async (x) => {return x + x;})(4)
यहाँ मूलभूत समस्या यह है कि एक एसिंक्रोनस फ़ंक्शन एक वादा वस्तु का उत्पादन करने वाला एक सिंक्रोनस फ़ंक्शन भी है ।
यहाँ नोड में एक असिंक्रोनस फ़ंक्शन को कॉल करने का एक उदाहरण है।
> (async (x) => {return x + x;})(4)
Promise { 8 }
आपके पास काल्पनिक रूप से एक भाषा हो सकती है, यहां तक कि एक गतिशील रूप से टाइप किया गया, जहां कॉल साइट पर अतुल्यकालिक और सिंक्रोनस फ़ंक्शन कॉल के बीच का अंतर दिखाई नहीं देता है और संभवतः परिभाषा साइट पर दिखाई नहीं देता है।
इस तरह की भाषा लेना और इसे जावास्क्रिप्ट में कम करना संभव है, आपको बस सभी कार्यों को अतुल्यकालिक रूप से प्रभावी बनाना होगा।