قصد داریم طی چند پست، بصورت کاملا گسترده به سوالاتی که در یک مصاحبه جاوا اسکریپت انجام میشه بپردازیم. در آخر هم بهترین وبسایتها برای کسانی که دنبال اپلای کردن هستن هم پیشنهاد میدم.
فانکش callback تابعی است که قرار است بعد از تابع دیگری اجرا شود. در جاوا اسکریپت و دیگر زبانهای مفسری اجرای کدها به صورت خط به خط است، زمانیکه در ترجمه خط به خط کدها مفسر به یک بخشی از کد برای مثال به یک تابع برخورد میکند که فرآیند دریافت پاسخ توسط تابع طولانی است، همزمان با اجرای آن بخش از کد، به خطهای بعدی برنامه رفته و آنها را اجرا میکند.
function callbackFunction(name) { console.log("Hello " + name); } function outerFunction(callback) { let name = prompt("Please enter your name."); callback(name); } outerFunction(callbackFunction);
از Promise همانند callback function برای مدیریت کردن دستورات غیر همزمان یا asynchronous استفاده میکنیم. منظور از دستورات غیر همزمان این است که در این نوع پردازش، زمانی که پردازشگر شروع به پردازش میکند، بدون اینکه منتظر اتمام پردازش اول باشد، پردازش دوم را شروع میکند.
const promise = new Promise(function (resolve, reject) { // promise description });
باعث میشود کدهای خوانا و تمیزتری بنویسیم، که قابلیت خطایابی و مدیریت کردن بالاتری نسبت به callback functionها دارد.
- حالت pending: این حالت اولیه Promise قبل از شروع عملیات است.
- حالت Fulfilled: این حالت نشان می دهد که عملیات مشخص شده تکمیل شده است.
- حالت Rejected: این حالت نشان میدهد که عملیات به پایان نرسیده است در این صورت یک خطا برگردانده میشود.
یک آنتی پترن با چندین کالبک تو در تو است که خواندن و دیباگ کردن کد را هنگام برخورد با دستورات ناهمزمان یا asynchronous سخت میکند.
async1(function(){ async2(function(){ async3(function(){ async4(function(){ .... }); }); }); });
به مرورگر این امکان را می دهد تا Updateهای ارسالی از طرف سرور را دریافت کند.
ابجکت EventSource برای دریافت اعلانهای رویداد ارسال شده توسط سرور استفاده میشود:
if (typeof EventSource !== "undefined") { var source = new EventSource("sse_generator.js"); source. = function (event) { document.getElementById("output") += event.data + "<br>" }; }
if (typeof EventSource !== "undefined") { // Server-sent events supported. Let's have some code here! } else { // No server-sent events supported }
- رویداد onopen: زمانی که یک اتصال به سرور برقرار شود، اتفاق می افتد.
- رویداد : زمانی اتفاق می افتد که یک پیام دریافت شود
- رویداد : زمانی که یک خطا رخ دهد اتفاق می افتد.
پرامیس برای مدیریت کردن عملیات ناهمگام استفاده میشن.
new Promise(function (resolve, reject) { resolve(); // or reject(); });
در پرامیس باید پایان یافتن عملیات را به جاوا اسکریپت بگیم. زمانی که عملیات به پایان رسید و خروجی کار موفقیت آمیز بود متد resolve را صدا میزنیم و اگر خطا داشت متد reject
پرامیس ابجکتی است که متد ()then. سازگار با استاندارد را ارائه میکند.
زمانی که پرامیس در حالت اجرا باشد میتواند به حالت رد شده یا تایید شده تغییر حالت دهد.
زمانی پرامیس به یکی از حالت resolve یا reject تغییر حالت داد نباید به هیچ حالت دیگری تغییر کند.
قبل از آنکه promise معرفی شود برای انجام چند وظیفهی غیر هم زمان از callback function استفاده ی زیادی میشد. استفاده از callback function ها مشکلاتی نیز به همراه داشت، که یکی از این مشکلات این بود که در برخی موارد منجر به تولید کدی میشد، که مدیریت کردن و خطایابی آن بسیار مشکل بود و گاهی غیر قابل کنترل بود. به این کد به اصطلاح callback hell میگویند. در نتیجه برای جلوگیری از وقوع این مسئله promise معرفی شد.