برنامه نویسی

آشنایی با حلقه رویداد، صف برگشت به تماس و پشته تماس در جاوا اسکریپت

پشته تماس:

  • ساختار داده ساده توسط موتور V8 ارائه شده است.
  • اجرای برنامه ما را با ردیابی توابع در حال اجرا دنبال می کند.
  • فایل Js کامل ما در تابع main() پیچیده می شود و برای اجرا در Call Stack اضافه می شود.
  • هر زمان که تابعی را فراخوانی می کنیم، به Call Stack اضافه می شود. هنگامی که اجرا می شود و به پایان می رسد از پشته خارج می شود.
//Basic Example

const x = 1;
const y = x + 2;
console.log('Sum is', y);

/*

- This code gets wrapped in main() and main is added to Call Stack.
- log('Sum is 3') added to call stack.
- On console we would get 'Sum is 3'. Now log function is finished and gets removed from Call Stack.
- Now end of script, main function gets popped out of Call Stack.
*/
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


const listLocations = (locations) => {
    locations.forEach((location) => {
        console.log(location);
    });
}

const myLocation = ['Delhi', 'Punjab'];
listLocations(myLocation)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  1. عملکرد اصلی روی پشته تماس قرار می گیرد.
  2. خط 1 ما تابع را اعلام می کنیم اما آن را فراخوانی نمی کنیم، بنابراین به پشته فراخوانی اضافه نمی شود.
  3. خط 7 ما آرایه مکان خود را تعریف می کنیم.
  4. خط 8 فراخوانی تابع، بنابراین برای فراخوانی پشته فشار داده می‌شود و آیتم بالایی در آنجا است.
  5. listLocations شروع به اجرا می کند. تحت فشار قرار دادند تا پشته را فراخوانی کنند.
  6. forEach یک فراخوانی تابع است بنابراین به پشته تماس اضافه می شود. برای هر کدام تابع ناشناس را یک بار برای هر مکان فرا می خواند.
  7. تابع anonymous(‘Delhi) برای فراخوانی پشته با آرگومان دهلی اضافه می شود.
  8. اکنون تابع console.log به پشته تماس اضافه می شود. دهلی را چاپ می کند و تمام می کند. و بیرون می زند.
  9. ناشناس (‘دهلی) تمام می شود و بیرون می آید.
  10. forEach هنوز انجام نشده است، بنابراین ظاهر نمی شود. ناشناس (‘Punjab) به پشته تماس اضافه می شود.
  11. اکنون تابع console.log به پشته تماس اضافه می شود. پنجاب را چاپ می کند و تمام می کند. و بیرون می زند.
  12. forEach تکمیل می شود و از این رو از پشته تماس خارج می شود.
  13. listLocations انجام شده است، از این رو بیرون می آید.
  14. اسکریپت تکمیل شد main() ظاهر می شود.

صف برگشت به تماس

کار این است که لیستی از تمام توابع برگشت به تماس را که باید اجرا شوند، حفظ کند.

console.log('Starting Up!');

setTimeout(() => {
    console.log('Two Seconds!');
}, 2000);

setTimeout(() => {
    console.log('Zero Seconds!');
}, 0);

console.log('Finishing Up!');

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  1. main() برای فراخوانی پشته فشار داده شد.
  2. خط 3: setTimeout برای فراخوانی پشته فشار داده شد. < setTimeout بخشی از JS V8 نیست اما بخشی از NodeJS است. پیاده سازی آن در C++ است که توسط NodeJs ارائه شده است.
  3. setTimeout هنگامی که فراخوانی می شود، رویدادی را ثبت می کند که یک جفت رویداد-بازخوانی است. رویداد در اینجا 2 ثانیه صبر کنید و پاسخ به تماس تابعی است که اجرا می شود. مثال دیگری از جفت رویداد-تماس تماس این است که منتظر بمانید تا درخواست پایگاه داده تکمیل شود و سپس فراخوانی را اجرا کنید که کاری با داده ها انجام می دهد.
  4. این رویداد جدید یعنی تابع setTimeout ظاهر می شود و در Node API ثبت می شود. ساعت 2 ثانیه شروع به تیک تاک کردن می کند.
    در حالی که منتظر آن ۲ ثانیه هستیم، می‌توانیم کارهای دیگری را انجام دهیم

  5. خط 7: setTimeout رویداد دیگری را در Node API ثبت می کند.

  6. اکنون مهلت زمانی 0 ثانیه به پایان رسیده است، اکنون پاسخ تماس باید اجرا شود.

Callback Queue در تصویر آمده است: وظیفه این است که فهرستی از تمام توابع پاسخ به تماس را که باید اجرا شوند، حفظ کند. آیتم جلو ابتدا اجرا می شود.

  1. پاسخ تماس setTimeout با وقفه 0 ثانیه ای به صف اضافه می شود تا بتوان آن را اجرا کرد. اما برای اجرا باید در Call Stack اضافه شود، این جایی است که تابع اجرا می شود.

اکنون، در اینجا Event Loops در تصویر می آید، به پشته تماس و صف پاسخ به تماس نگاه می کند، اگر پشته تماس خالی باشد، موارد را از صف پاسخ به تماس اجرا می کند. < این دلیل "تمام شدن!" قبل از "صفر ثانیه!" ثبت شده است! همانطور که main در پشته تماس بود، حلقه رویداد منتظر است تا main خارج شود>

  1. log (“صفر ثانیه!”) به پشته تماس اضافه می شود. و پیام روی کنسول چاپ می شود.
  2. main کامل شده و بیرون می آید.
  3. حلقه رویداد مورد را از صف برگشت تماس می گیرد و به پشته تماس فشار می دهد. “صفر ثانیه!” چاپ می کند.
  4. پس از به دست آوردن 2 ثانیه، پاسخ به تماس (‘دو ثانیه!’) به صف پاسخ به تماس اضافه می شود، به پشته تماس منتقل می شود، اجرا می شود. “دو ثانیه!” چاپ می کند.

ماهیت غیر مسدود کننده Node.js

  • جاوا اسکریپت تک رشته ای است، به این معنی که تنها یک تابع را می توان در یک زمان اجرا کرد.
  • با این حال، Node.js و محیط مرورگر، وظایف ناهمزمان را با استفاده از رشته‌های دیگر مدیریت می‌کنند.
  • در حالی که پشته تماس در حال اجرای کد همزمان است، محیط رویدادهای ناهمزمان را در پس‌زمینه مدیریت می‌کند.

خلاصه

  • پشته تماس بگیرید: ساختاری که فراخوانی های تابع را پیگیری می کند. فقط یک تابع می تواند در یک زمان اجرا شود.
  • صف برگشت به تماس: صفی که فراخوان هایی را نگه می دارد که آماده اجرا هستند.
  • حلقه رویداد: مکانیزمی که بررسی می‌کند که آیا پشته تماس خالی است یا خیر، تماس بعدی را از صف برگشت به پشته تماس هل می‌دهد.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا