Node.js در یک thread منفرد رویداد حلقه اجرا شده و با قدرت فراخوانی غیرهمزمان می تواند کارهای مختلفی انجام دهد . کارهایی مانند عملیات I/O . درست در هنگامی که زبان های برنامه نویسی دیگر یک تقاضای دیتابیسی ارسال می کنند و منتظر نتیجه ی آن هستند ، Node.js این انتظار را نخواهد کشید و هنگامی که تقاضای دیتابیس ارسال شد ، Node.js به اجرای ادامه ی کدهای بعد از آن خواهد پرداخت و هنگامی که نتیجه آماده شد به آن تقاضا بازخواهد گشت .
بخش 3 – Node.JS ، معرفی - Asynchronous
Node.js در یک thread منفرد رویداد حلقه اجرا شده و با قدرت فراخوانی غیرهمزمان می تواند کارهای مختلفی انجام دهد . کارهایی مانند عملیات I/O . درست در هنگامی که زبان های برنامه نویسی دیگر یک تقاضای دیتابیسی ارسال می کنند و منتظر نتیجه ی آن هستند ، Node.js این انتظار را نخواهد کشید و هنگامی که تقاضای دیتابیس ارسال شد ، Node.js به اجرای ادامه ی کدهای بعد از آن خواهد پرداخت و هنگامی که نتیجه آماده شد به آن تقاضا بازخواهد گشت .
این یک مفهوم بسیار سودمند خواهد بود ، اما گاه و بیگاه نیاز به کار بیشتر در End خواهد داشت تا بتوانید از این موقعیت بهره ببرید .
برنامه نویسی غیرهمزمان
در برنامه نویسی های قدیمی اکثر عملیات I/O بصورت همزمان اتفاق می افتاد . اگر شما به زبان جاوا فکر کنید و بیاندیشید که چگونه می توانستید یک فایل را بخوانید ، با کدی مشابه زیر روبرو می شوید :
در پشت کار چه اتفاقی می افتد؟ thread اصلی تا زمانی که فایل خوانده شود بلاک می گردد و این بدان معناست که هیچ عمل دیگری در این بین انجام نخواهد گرفت . برای حل این مشکل و استفاده ی بهینه از CPU خود شما مجبور هستید تا بصورت دستی thread ها را در اختیار گیرید .
اگر شما عملیات قفل کننده ی بیشتری داشته باشید وضعیت از این هم بدتر خواهد شد .

در تصویر بالا بخش های قرمز رنگ نشان دهنده ی منتظر پاسخ بودن process برای منابع خارجی می باشد ، بخش های سیاه رنگ نمایش دهنده ی زمان اجرای کدهای شما بوده ، و بخش های سبز رنگ نشان از زمان های استراحت نرم افزاردارد .
برای حل این مشکل که مشاهده کردید Node.js مدل برنامه نویسی غیرهمزمان یا asynchronous را ارائه داده است .
I/O غیرهمزمان در واقع یک فرم از ورودی – خروجی می باشد که به سایر پروسه ها اجازه ی ادامه فعالیت را قبل از پایان پروسه ی جاری خواهد داد .
در مثال زیر یک نمونه از خواندن فایل را توسط Node.js با هم بررسی می کنیم . در هر دو حالت همزمان و غیر همزمان شما از بلاک شدن ادامه ی کار نرم افزار خودداری می کنید .
در روش همزمان کد خواندن فایل در Node.js بصورت زیر خواهد بود :
در اینجا چه اتفاقی افتاده است ؟ ما یک فایل را توسط ماژول همزمان fs می خوانیم . انتظار می رود که متغیر content شامل محتویات فایل file.md باشد . مشکل آنجاست که برای رسیدن به این هدف Node.js باید تا رسیدن به اتمام عملیات بلاک شود . و بدان معناست که تا زمان خوانده شدن فایل فعالیت دیگری قابل انجام نخواهد بود .
حال ببینیم که چطور می شود این مشکل را مرتفع کرد .
برنامه نویسی غیرهمزمان asynchronous – همانگونه که در جاوا اسکریپت می شناسیم – تنها با استفاده از first-class ها در آن زبان قابل انجام خواهد بود . آن ها می توانند مانند سایر متغیرها در بین توابع جابجا و پاسکاری شوند . توابعی که می توانند به عنوان آرگومان سایر توابع مورد استفاده قرار بگیرند به عنوان توابع high-order شناخته می شوند .
یکی از مثال های ساده و آسان در زمینه ی توابع high-order بصورت زیر می باشد :
در مثال بالا ما یک تابع را به یک تابع فیلتر پاس دادیم این روش در واقع منطق استفاده از فیلترینگ خواهد بود . در واقع CallBack ها از اینجا متولد شده اند : اگر شما یک تابع را بعنوان پارامتر به تابعی دیگر ارسال نمایید ، شما می توانید آن تابع را می توانید در خلال تابع خود هنگامی که کارتان به پایان رسید صدا بزنید . نیازی به برگشت مقدار نخواهد بود و تنها کافیست که تابع دیگر را فراخوانی نمایید .
فراخوانی های so-called error-first در قلب Node.js بوده که ماژول های هسته از آن مانند اکثر ماژول های موجود در NPM استفاده می کند .
نکته ی قابل توجه در اینجا این است که :
· Error-handling : بجای استفاده از try-catch شما نیاز به بررسی خطاها دارید
· بدون مقدار برگشتی : متدهای غیرهمزمان مقداری را برنمی گردانند اما مقادیر در callback ها پاسکاری می شوند .
حال کمی تمرین بالا را تغییر می دهیم :
خروجی اسکریپت بالا بصورت زیر خواهد بود :
همانگونه که می بینید ما یکبار شروع به خواندن فایل کرده و سپس اجرا ادامه خواهد یافت و نرم افزار مقدار end of the file را چاپ خواهد کرد .
Event Loop
حلقه ی رویداد Event Loop قلب Node.js بوده و مسئول زمانبندی کردن عملیات غیرهمزمان می باشد .
قبل از اینکه بطور عمیق تر وارد مسئله شویم اجازه دهید تا با مفهوم برنامه نویسی رویداد محور event-driven بیشتر آشنا شویم .
برنامه نویسی رویداد محور Event-Driven یک الگوی برنامه نویسی می باشد که جریان برنامه با رویدادهایی مانند فعالیت های کاربر ( کلیک ماوس ، فشردن کلید ) ، سنسورهای خروجی ، یا پیامی از برنامه ای یا thread دیگر مشخص می گردد .
در واقع مشخص می کند که نرم افزار براساس رویداد فعالیت خواهد نمود .
بنابراین ، همانطور که ما در اول این بخش اشاره کردیم Node.js یک thread منفرد اشاره خواهد نمود . که بدان معناست که شما با thread ها و همزمان سازی آن ها سروکار نخواهید داشت و Node.js این پیچیدگی را از خود مجزا نموده است . هر چیزی در کدهای شما بصورت موازی اجرا خواهد شد .
شاد و سلامت باشید
محمد جعفری فوتمی