मैं इसके बारे में सोच रहा हूं और यही मैं इसके साथ आया हूं:
आइए इस कोड को नीचे देखें:
console.clear();
console.log("a");
setTimeout(function(){console.log("b");},1000);
console.log("c");
setTimeout(function(){console.log("d");},0);
एक अनुरोध आता है, और जेएस इंजन कदम से कदम ऊपर कोड निष्पादित करना शुरू कर देता है। पहले दो कॉल सिंक कॉल हैं। लेकिन जब यह setTimeout
विधि की बात आती है , तो यह एक async निष्पादन बन जाता है। लेकिन जेएस तुरंत इससे लौटता है और निष्पादित करना जारी रखता है, जिसे कहा जाता है Non-Blocking
या Async
। और यह अन्य आदि पर काम करना जारी रखता है।
इस निष्पादन के परिणाम निम्नलिखित हैं:
acdb
तो मूल रूप से दूसरा setTimeout
पहले समाप्त हो गया और इसके कॉलबैक फ़ंक्शन को पहले वाले की तुलना में पहले निष्पादित किया गया और इससे समझ में आता है।
हम यहां सिंगल-थ्रेडेड एप्लिकेशन के बारे में बात कर रहे हैं। जेएस इंजन इसे निष्पादित करता रहता है और जब तक यह पहला अनुरोध पूरा नहीं करता है, यह दूसरे पर नहीं जाएगा। लेकिन अच्छी बात यह है कि यह ब्लॉकिंग ऑपरेशंस के लिए इंतजार नहीं करेगा जैसे कि इसे setTimeout
हल करने के लिए यह तेज़ होगा क्योंकि यह नए आने वाले अनुरोधों को स्वीकार करता है।
लेकिन मेरे सवाल निम्नलिखित मदों के आसपास उठते हैं:
# 1: अगर हम एकल-थ्रेडेड एप्लिकेशन के बारे में बात कर रहे हैं, तो setTimeouts
जेएस इंजन अधिक अनुरोधों को स्वीकार करते हुए और उन्हें निष्पादित करते हुए क्या प्रक्रिया करता है? एकल धागा अन्य अनुरोधों पर कैसे काम करना जारी रखता है? setTimeout
अन्य अनुरोधों के आने और क्रियान्वित होने पर क्या काम करता है ।
# 2: यदि इन setTimeout
अनुरोधों को पर्दे के पीछे निष्पादित किया जाता है, जबकि अधिक अनुरोध आ रहे हैं और निष्पादित किए जा रहे हैं, तो पर्दे के पीछे से एसिंक्स निष्पादित क्या करता है? यह कौन सी बात है जिस पर हम बात करते हैं EventLoop
?
# 3: लेकिन क्या पूरे तरीके को EventLoop
ऐसा नहीं रखा जाना चाहिए जिससे कि पूरी चीज निष्पादित हो जाए और कॉलबैक विधि को कॉल किया जाए? कॉलबैक फ़ंक्शंस के बारे में बात करते समय यह मेरी समझ में आता है:
function downloadFile(filePath, callback)
{
blah.downloadFile(filePath);
callback();
}
लेकिन इस मामले में, जेएस इंजन को यह कैसे पता चलता है कि क्या यह एक एसिंक्स फ़ंक्शन है ताकि यह कॉलबैक को अंदर रख सके EventLoop
? शायद async
C # में कीवर्ड की तरह कुछ या किसी प्रकार की विशेषता जो जेएस इंजन को लेने वाली विधि को इंगित करती है एक एसिंक्स विधि है और उसके अनुसार इलाज किया जाना चाहिए।
# 4: लेकिन एक लेख कहता है कि जो चीजें काम कर रही थीं, मैं उस पर काफी विपरीत था:
इवेंट लूप कॉलबैक फ़ंक्शन की एक कतार है। जब कोई async फ़ंक्शन निष्पादित होता है, तो कॉलबैक फ़ंक्शन को कतार में धकेल दिया जाता है। जावास्क्रिप्ट इंजन ईवेंट लूप को तब तक संसाधित करना शुरू नहीं करता है जब तक कि किसी async फ़ंक्शन द्वारा कोड को निष्पादित नहीं किया जाता है।
# 5: और यहाँ यह छवि है जो सहायक हो सकती है लेकिन छवि में पहली व्याख्या यह कह रही है कि प्रश्न संख्या 4 में उल्लिखित एक ही बात है:
तो मेरा प्रश्न यहाँ ऊपर सूचीबद्ध वस्तुओं के बारे में कुछ स्पष्टीकरण प्राप्त करना है?