کنسول همگام
کنسول همگام
هیچ مشخصات یا مجموعهای از الزامات در مورد نحوه عملکرد کنسول وجود ندارد. روشهای * به طور رسمی بخشی از جاوا اسکریپت نیستند، اما در عوض توسط محیط میزبانی به JS اضافه میشوند (به عنوان Types & Grammar این سری کتاب مراجعه کنید).
بنابراین، مرورگرهای مختلف و محیطهای JS هر کاری که میخواهند انجام میدهند، که گاهی اوقات منجر به رفتار گیجکننده میشود.
به طور خاص، برخی از مرورگرها و برخی شرایط وجود دارند که console.log(..) در واقع فوراً آنچه را که داده شده است خروجی نمی دهد. دلیل اصلی که ممکن است این اتفاق بیفتد این است که I/O بخشی بسیار کند و مسدود کننده بسیاری از برنامه ها (نه فقط JS) است. بنابراین، ممکن است عملکرد بهتری (از منظر صفحه/UI) برای یک مرورگر داشته باشد که ورودی/خروجی کنسول را به صورت ناهمزمان در پسزمینه مدیریت کند، بدون اینکه شما حتی بدانید که این اتفاق افتاده است.
معمولاً انتظار داریم که یک شی را دقیقاً در لحظهی دستور console.log(..) عکس گرفته شود و چیزی مانند { index: 1 } را چاپ کند، به طوری که در دستور بعدی وقتی a.index++ اتفاق میافتد، در حال تغییر است. چیزی متفاوت از خروجی یک یا فقط بعد از آن.
اغلب اوقات، کد قبلی احتمالاً نمایش یک شی را در کنسول ابزار توسعهدهنده شما تولید میکند که همان چیزی است که انتظار دارید. اما ممکن است همین کد در شرایطی اجرا شود که مرورگر احساس کند که باید ورودی/خروجی کنسول را به پسزمینه موکول کند، در این صورت ممکن است زمانی که شی در کنسول مرورگر نمایش داده میشود، a.index++ قبلاً اتفاق افتاده است، و { index: 2 } را نشان می دهد.
این یک هدف متحرک است که تحت چه شرایطی دقیقاً ورودی/خروجی کنسول به تعویق میافتد یا حتی قابل مشاهده است. فقط از این ناهمزمانی احتمالی در I/O آگاه باشید، در صورتی که در اشکال زدایی با مشکلاتی مواجه شوید که در آن اشیاء پس از یک عبارت console.log(..) اصلاح شده اند و در عین حال تغییرات غیرمنتظره را مشاهده می کنید.
توجه: اگر با این سناریوی نادر مواجه شدید، بهترین گزینه این است که به جای تکیه بر خروجی کنسول، از نقاط شکست در دیباگر JS خود استفاده کنید. بهترین گزینه بعدی این است که یک “عکس فوری” از شی مورد نظر را با سریال کردن آن به یک رشته، مانند JSON.stringify(..) اجباری کنید.
حلقه رویداد
بیایید یک ادعای (شاید تکان دهنده) داشته باشیم: علیرغم اینکه شما به وضوح قادر به نوشتن کد JS ناهمزمان هستید (مانند بازه زمانی که ما به آن نگاه کردیم)، تا همین اواخر (ES6)، خود جاوا اسکریپت در واقع هیچ مفهوم مستقیمی از ناهمزمانی در آن تعبیه نشده بود. .
چی!؟ این یک ادعای دیوانه کننده به نظر می رسد، درست است؟ در واقع، کاملاً درست است. خود موتور JS هرگز کاری بیش از اجرای یک تکه از برنامه شما در هر لحظه، زمانی که از شما خواسته شده است، انجام نداده است.
“از او خواسته شد.” توسط چه کسی؟ این قسمت مهم است!
موتور JS به صورت مجزا کار نمی کند. این در داخل یک محیط میزبانی اجرا می شود، که برای اکثر توسعه دهندگان یک مرورگر وب معمولی است. در طول چندین سال گذشته (اما به هیچ وجه به طور انحصاری)، JS از طریق چیزهایی مانند Node.js فراتر از مرورگر به محیط های دیگر مانند سرورها گسترش یافته است. در واقع، جاوا اسکریپت این روزها در انواع دستگاه ها، از روبات ها گرفته تا لامپ ها، تعبیه شده است.
اما یک “رشته” مشترک (این یک شوخی ناهمزمان نه چندان ظریف است) همه این محیط ها این است که آنها مکانیزمی در خود دارند که اجرای چندین تکه از برنامه شما را در طول زمان و در هر لحظه با فراخوانی انجام می دهد. موتور JS، به نام “حلقه رویداد”.
به عبارت دیگر، موتور JS هیچ حس ذاتی از زمان نداشته است، اما در عوض یک محیط اجرای بر اساس تقاضا برای هر قطعه دلخواه JS بوده است. این محیط اطراف است که همیشه “رویدادها” (اجرای کد JS) را برنامه ریزی کرده است.
بنابراین، برای مثال، زمانی که برنامه JS شما یک درخواست Ajax برای واکشی برخی از داده ها از یک سرور ارائه می دهد، شما کد “پاسخ” را در یک تابع تنظیم می کنید (که معمولاً به آن “بازخوانی” می گویند) و موتور JS به محیط میزبانی می گوید: “هی، من فعلاً اجرا را به حالت تعلیق در میآورم، اما هر زمان که درخواست شبکه را تمام کردید و مقداری داده دارید، لطفاً این تابع را دوباره فراخوانی کنید.”
سپس مرورگر به گونه ای تنظیم می شود که به پاسخ شبکه گوش دهد، و وقتی چیزی برای ارائه به شما دارد، با قرار دادن آن در حلقه رویداد، عملکرد برگشت تماس را برنامه ریزی می کند تا اجرا شود.
بنابراین حلقه رویداد چیست؟
قوانین ارسال دیدگاه در سایت