درود
این شکل از اجرای کد برمیگرده به نحوه تفسیر کدها توسط engine و مفسر جاوا اسکریپت
کد ها از بالا به پایین خونده میشن. هنگامی که به setTimeout میرسه میره به خط بعد و همه چیز که اجرا شد بر میگرده و شماره ۲ رو با وقفه ۰ صدم ثانیه پرینت میکنه
برای اطلاعات بیشتر ،مبحث اسکوپهارو در جاوااسکریپت دنبال کنید
درون nodejs ابتدا تمامی کدها تفسیر میشن و درون یک پشته قرار میگیرن. کدهایی که به صورت async نوشته میشن درون یک صف جداگانه به نام event loop قرار میگیرن . وقتی که کار پشته اصلی تمام بشه بعدش نوبت به اجرا شدن پشته event loop میشه.
یه حلقه وجود داره که به صورت دائم روی پشته ی اصلی اجرا میشه (به هر بار که اجرا میشه یک تیک میگن) و هر دفعه یک دستور رو از روی پشته بر میداره و اون رو اجرا میکنه. وقتی که پشته ی اصلی خالی بشه نوبت به پشته ی event loop میشه. بنابراین دستورات event base و async بعد از دستورات عادی نتیجه گیری میشن.
یه نگاه به لینک زیر بندازید خوب توضیح نداده! اما از هیچی بهتره!
https://blog.risingstack.com/node-js-at-scale-understanding-node-js-event-loop/
@ali.bayat @kazemi
ربطی به اسکوپ و تاخیر زمانی نداره. اگه دقت کنید تاخیرش صفر هست و کدها همه در یک سطح در اسکوپ گلوبال اجرا شدن.
برمیگرده به call stack و event loop stack که نود اول call stack رو خالی میکنه بعدش میره event loop stack رو اجرا میکنه پس دستورات ایونت بیس و async بعد از دستورات اصلی اجرا میشن.
کدهاتون رو به درستی قرار می دادید بهتر بودش.
دلیل کلی ش اینه که وقتی مباحث ناهمزمانی مطرح میشند، موتور جاوااسکریپت روی کدها توقف نمی کنه و میره سراغ کدهای بعدی.
در اینجا هم خط دوم کدهای شما و تابع setTimeout() باعث ایجاد این پدیده میشه.
اما در خصوص جزئیات و پشت صحنه ی نحوه عملکردش، جناب @khanzadimahdi توضیح دادند که چطور به کمک پشته ی event loop، این فرآیند صورت میگیره.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟