আমি মনে করি আমরা স্ট্যাক থেকে পৃথক করে ইভেন্ট লুপটি নিয়ে আলোচনা করতে পারি না, সুতরাং:
জেএসের তিনটি "স্ট্যাক" রয়েছে:
- সমস্ত সিঙ্ক্রোনাস কলগুলির জন্য স্ট্যান্ডার্ড স্ট্যাক (এক ফাংশন অন্যটিকে কল করে, ইত্যাদি)
- উচ্চ অগ্রাধিকার (প্রসেস.নেক্সটটিক, প্রতিশ্রুতি, অবজেক্ট.অবজার, মিউটেশনঅবার্সার) সহ সমস্ত অ্যাসিঙ্ক ক্রিয়াকলাপের জন্য মাইক্রোটাস্ক সারি (বা কাজের সারি বা মাইক্রোটাস্ক স্ট্যাক )
- নিম্ন অগ্রাধিকার (সেটটাইমআউট, সেটইন্টারভাল, সেটইমিডিয়েট, অনুরোধএনিমেশন ফ্রেম, আই / ও, ইউআই রেন্ডারিং) সহ সমস্ত অ্যাসিঙ্ক ক্রিয়াকলাপের জন্য ম্যাক্রোটাস্ক সারি (বা ইভেন্টের সারি, টাস্ক সারি, ম্যাক্রোটাস্ক সারি )
|=======|
| macro |
| [...] |
| |
|=======|
| micro |
| [...] |
| |
|=======|
| stack |
| [...] |
| |
|=======|
এবং ইভেন্ট লুপটি এইভাবে কাজ করে:
- স্ট্যাক থেকে নীচে থেকে উপরে সবকিছু সম্পাদন করুন এবং কেবল যখন স্ট্যাকটি খালি থাকে, উপরের সারিতে কী চলছে তা পরীক্ষা করে দেখুন
- মাইক্রো স্ট্যাকটি পরীক্ষা করুন এবং স্ট্যাকের সাহায্যে সমস্ত কিছু (যদি প্রয়োজন হয়) সম্পাদন করুন, মাইক্রোটাস্ক সারি খালি না হওয়া পর্যন্ত একের পর এক মাইক্রো টাস্ক বা কোনও এক্সিকিউশন প্রয়োজন হয় না এবং কেবল ম্যাক্রো স্ট্যাক পরীক্ষা করুন
- ম্যাক্রো স্ট্যাকটি পরীক্ষা করুন এবং স্ট্যাকের সাহায্যে সেখানে সমস্ত কিছু (যদি প্রয়োজন হয়) সম্পাদন করুন
স্ট্যাক খালি না হলে মাইোক স্ট্যাক টাচ হবে না। মাইক্রো স্ট্যাকটি ফাঁকা না থাকলে বা কোনও প্রয়োগের প্রয়োজন না হলে ম্যাক্রো স্ট্যাকটি স্পর্শ করবে না।
সংক্ষিপ্তসার হিসাবে: মাইক্রোটাস্ক সারি ম্যাক্রোটাস্ক সারি হিসাবে প্রায় একই তবে সেই কাজগুলি (প্রক্রিয়া.নেক্সটটিক, প্রতিশ্রুতিগুলি, অবজেক্ট.ওব্রিজ, মিউটেশনঅবার্সার) ম্যাক্রোটাস্কের চেয়ে বেশি অগ্রাধিকার রয়েছে।
মাইক্রো ম্যাক্রোর মতো তবে উচ্চ অগ্রাধিকার সহ।
এখানে সমস্ত কিছু বোঝার জন্য আপনার কাছে "চূড়ান্ত" কোড রয়েছে।
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();