مهدی عادلی فر
بنیانگذار توسینسو و برنامه نویس

پرومیس چیست؟ آشنایی با Promise به زبان ساده

Promise چیست؟ آشنایی با پرومیس ، در صفحات وب امروزی کمتر صفحه‌ای را می‌توان پیدا کرد که از Ajax داخل آن استفاده نشده باشد. حال ajax چیست؟ به زبان ساده برای ارتباط صفحه با سرور به صورتی که صفحه رفرش نشود از متدی به نام Ajax استفاده می‌شود که در زبان جاوااسکریپت به روش‌های گوناگون می‌توان آن را پیاده‌سازی کرد.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
سرفصل های این مطلب
  1. Promise چیست؟

این ارتباط مرورگر با سرور یک ارتباط غیرهماهنگ یا آسنکرون یا Asynchronous می‌باشد. یعنی مرورگر درخواستی را به سرور ارسال می کند ولی همانجا در همان خط منتظر نمی‌ماند تا پاسخ را دریافت کند و به کار خود ادامه می‌دهد و کدهای دیگر را اجرا می کند. حال سؤال اینجاست که وقتی که سرور پاسخ مرورگر را داد، مرورگر چگونه با آن پاسخ رفتار می‌کند و از نتایج استفاده می نماید. جواب این سؤال استفاده از Promise است. در این مطلب در مورد  Promise ها صحبت می کنیم. 

Promise چیست؟

Promise کلاسی است که در عملیات غیرهمزمان یا async نتیجه شیئی از این کلاس است.  پاسخ  Promise به یک درخواست ممکن است دو حالت داشته باشد یا پاسخ درخواست با موفقیت دریافت شده است و یا اینکه انجام درخواست با خطا مواجه شده است. که کلاس  Promise برای هرکدام از این حالت‌ها یک متد تعریف کرده است. برای مثال کد زیر را در نظر بگیرید که برای اینکه بین درخواست و نتیجه فاصله زمانی ایجاد شود ۲ ثانیه تأخیر ایجاد کرده ایم.

function delay(){
    return new Promise(function(resolve,reject){
        return setTimeout(function(){resolve("tosinso")}, 2000);
    });
}

تابع بالا بعد از دو ثانیه متد callback مربوط به resolve را که مبنی بر درست بودن اجرا هست را فراخوانی می کند. در ادامه از این کد استفاده کرده ایم.

function logMessage(name){
    console.log(`hello  ${name} `);
}
delay().then(logMessage);

همانطور که در بالا دیده می‌شود تابع logMessage منتظر می‌ماند تا تابع delay نتیجه دهد و بعد از آن اجرا شود. دقت داشته باشید که جواب تابع delay یک شی از نوع Promise است. نتایج درخواست های Ajax نیز به صورت Promise برگردانده می شود.
حال می‌توان از  Promise به صورت زنجیروار هم استفاده کرد. یعنی اینکه چند عملیات را به گونه‌ای اجرا کنیم که تا عملیات قبلی انجام نشده عملیات جدید انجام نشود بدون در نظر گرفتن اینکه هر عملیات چقدر زمانبر باشد. کد زیر مثالی از  Promise های زنجیروار است.

function delay(){
    return new Promise(function(resolve,reject){
        return setTimeout(function(){resolve("tosinso")}, 2000);
    });
}
function logMessage(name){
    let message = `hello  ${name} `;
    console.log(message);
    return message;
}
delay()
    .then(logMessage)
    .then((result)=>{
        alert(result);});

در کد بالا بعد از ۲ ثانیه پیام hello tosinso در کنسول چاپ می‌شود و  بعد از آن به صورت پیام alert نمایش داده می شود. حال هر زمان که انجام دستورات با مشکلی مواجه شود خطا رخ می‌دهد و می‌توان به شکل کد زیر با استفاده از تابع catch خطا را مدیریت کرد.

function delay(){
    return new Promise(function(resolve,reject){
        return setTimeout(function(){resolve("tosinso")}, 2000);
    });
}
function logMessage(name){
    throw new Error('Error in this line')
    let message = `hello  ${name} `;
    console.log(message);
    return message;
}
delay()
    .then(logMessage)
    .then((result)=>{
        alert(result);})
    .catch(e=>console.log(`error ${e}`));

در کد بالا در تابع logMessage خطایی را تولید کرده‌ایم که با رسیدن به این خط اجرای برنامه متوقف شده و یک پیام خطا صادر می‌شود و در تابع catch این خطا گرفته شده و پیام مناسب صادر می شود. دقت داشته باشید که مثالی که زده شد شاید در دنیای واقعی استفاده ای نداشته باشد ولی از همین روش می توان برای مدیریت درخواست های Ajax استفاده کرد.


مهدی عادلی فر
مهدی عادلی فر

بنیانگذار توسینسو و برنامه نویس

مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.

نظرات