تکمیل تا اجرا
تکمیل تا اجرا
به دلیل تک رشتهای بودن جاوا اسکریپت، کد داخل foo() (و bar()) اتمی است، به این معنی که وقتی foo() شروع به اجرا کرد، قبل از اینکه کدهای موجود در bar() بتوانند کامل شوند، کل کد آن تمام میشود. اجرا کنید یا برعکس به این رفتار «اجرای تکمیل» می گویند
در واقع، زمانی که foo() و bar() کد بیشتری در خود داشته باشند، معنای run-to-completion واضح تر است
از آنجایی که foo() را نمی توان با bar() قطع کرد، و bar() را نمی توان با foo() قطع کرد، این برنامه فقط دو نتیجه ممکن دارد بسته به اینکه کدامیک اول شروع به اجرا کند — در صورتی که threading وجود داشته باشد و عبارات فردی در foo() و bar() را می توان در هم آمیخت، تعداد نتایج ممکن بسیار افزایش می یابد!
قطعه 1 همزمان است (اکنون اتفاق می افتد)، اما تکه های 2 و 3 ناهمزمان هستند (بعدا اتفاق می افتد)، به این معنی که اجرای آنها با فاصله زمانی از هم جدا می شود.
دو نتیجه از یک کد به این معنی است که ما هنوز عدم قطعیت داریم! اما در سطح ترتیب تابع (رویداد) قرار دارد، به جای اینکه در سطح ترتیب بیانیه (یا در واقع سطح ترتیب عملیات عبارت) همانطور که در مورد رشته ها وجود دارد. به عبارت دیگر، قطعی تر از موضوعات است.
همانطور که در رفتار جاوا اسکریپت اعمال می شود، این غیر قطعی بودن ترتیب تابع اصطلاح رایج “شرط مسابقه” است، زیرا foo() و bar() با یکدیگر مسابقه می دهند تا ببینند کدام یک اول اجرا می شود. به طور خاص، این یک “شرایط مسابقه” است زیرا شما نمی توانید به طور قابل اعتماد پیش بینی کنید که a و b چگونه نتیجه خواهند گرفت.
توجه: اگر تابعی در JS وجود داشت که به نوعی رفتار اجرا تا تکمیل را نداشت، میتوانستیم نتایج احتمالی بیشتری داشته باشیم، درست است؟ به نظر می رسد ES6 دقیقاً چنین چیزی را معرفی می کند (به فصل 4 “ژنراتورها” مراجعه کنید)، اما فعلا نگران نباشید، ما به آن باز خواهیم گشت!
همزمانی
بیایید سایتی را تصور کنیم که فهرستی از بهروزرسانیهای وضعیت (مانند فید اخبار شبکه اجتماعی) را نمایش میدهد که به تدریج با پیمایش کاربر در فهرست بارگیری میشود. برای اینکه چنین ویژگی به درستی کار کند، (حداقل) دو “فرآیند” جداگانه باید به طور همزمان اجرا شوند (یعنی در طول یک پنجره زمانی، اما نه لزوما در یک لحظه).
توجه: ما در اینجا از “فرآیند” در نقل قول استفاده می کنیم، زیرا آنها فرآیندهای واقعی سطح سیستم عامل در مفهوم علوم کامپیوتری نیستند. آنها فرآیندها یا وظایف مجازی هستند که نشان دهنده یک سری عملیات متوالی و منطقی مرتبط هستند. ما به سادگی «فرایند» را بر «وظیفه» ترجیح میدهیم، زیرا از نظر اصطلاحی، با تعاریف مفاهیمی که در حال بررسی آن هستیم مطابقت دارد.
اولین “فرآیند” به رویدادهای onscroll (ایجاد درخواست های Ajax برای محتوای جدید) پاسخ می دهد، زیرا هنگامی که کاربر صفحه را بیشتر به پایین اسکرول می کند، فعال می شوند. دومین “فرآیند” پاسخ های Ajax را دریافت می کند (برای ارائه محتوا در صفحه).
قوانین ارسال دیدگاه در سایت