मुझे लगता है कि हम स्टैक से अलग होने की घटना लूप पर चर्चा नहीं कर सकते, इसलिए:
JS के तीन "ढेर" हैं:
- सभी तुल्यकालिक कॉल के लिए मानक स्टैक (एक फ़ंक्शन दूसरे को कॉल करता है, आदि)
- microtask कतार (या नौकरी कतार या microtask स्टैक) उच्च प्राथमिकता के साथ सभी async संचालन के लिए (प्रक्रिया ।nextTick, वादे, Object.observe, MutationObserver)
- निचली प्राथमिकता (सेटटाइमआउट, सेटइंटरवाल, सेटइमाउडेट, अनुरोधअनिमेशनफ्रेम, I / O, UI रेंडरिंग) के साथ सभी async संचालन के लिए मैक्रोटस्क कतार (या ईवेंट कतार, कार्य कतार, मैक्रोटस्क कतार )
|=======|
| macro |
| [...] |
| |
|=======|
| micro |
| [...] |
| |
|=======|
| stack |
| [...] |
| |
|=======|
और इवेंट लूप इस तरह से काम करता है:
- स्टैक से नीचे से ऊपर तक सब कुछ निष्पादित करें, और केवल जब स्टैक खाली हो, तो जांचें कि ऊपर कतारों में क्या चल रहा है
- माइक्रो स्टैक की जांच करें और स्टैक की मदद से वहां (यदि आवश्यक हो) सब कुछ निष्पादित करें, एक माइक्रो टास्क एक दूसरे के बाद जब तक कि माइक्रोटस्क कतार खाली है या किसी भी निष्पादन की आवश्यकता नहीं है और केवल तब मैक्रो स्टैक की जांच करें
- मैक्रो स्टैक की जांच करें और स्टैक की मदद से वहां (यदि आवश्यक हो) सब कुछ निष्पादित करें
यदि स्टैक खाली नहीं है तो माइको स्टैक स्पर्श नहीं करेगा। यदि माइक्रो स्टैक खाली नहीं है या किसी निष्पादन की आवश्यकता नहीं है तो मैक्रो स्टैक स्पर्श नहीं करेगा।
योग करने के लिए: माइक्रोटस्क कतार लगभग मैक्रोटस्क कतार के समान है, लेकिन उन कार्यों (प्रक्रिया.nextTick, वादे, Object.observe, MutationObserver) में मैक्रोटॉक्स की तुलना में अधिक प्राथमिकता है।
माइक्रो मैक्रो की तरह है लेकिन उच्च प्राथमिकता के साथ।
यहां आपके पास सब कुछ समझने के लिए "अंतिम" कोड है।
console.log('stack [1]');
setTimeout(() => console.log("macro [2]"), 0);
setTimeout(() => console.log("macro [3]"), 1);
const p = Promise.resolve();
for(let i = 0; i < 3; i++) p.then(() => {
setTimeout(() => {
console.log('stack [4]')
setTimeout(() => console.log("macro [5]"), 0);
p.then(() => console.log('micro [6]'));
}, 0);
console.log("stack [7]");
});
console.log("macro [8]");
/* Result:
stack [1]
macro [8]
stack [7], stack [7], stack [7]
macro [2]
macro [3]
stack [4]
micro [6]
stack [4]
micro [6]
stack [4]
micro [6]
macro [5], macro [5], macro [5]
--------------------
but in node in versions < 11 (older versions) you will get something different
stack [1]
macro [8]
stack [7], stack [7], stack [7]
macro [2]
macro [3]
stack [4], stack [4], stack [4]
micro [6], micro [6], micro [6]
macro [5], macro [5], macro [5]
more info: https://blog.insiderattack.net/new-changes-to-timers-and-microtasks-from-node-v11-0-0-and-above-68d112743eb3
*/
while (task = todo.shift()) task();