به نام دانای بر حق
مقدمه
به یاد دارم زمانی که nodejs رو شروع کردم یکی از چیزهایی که منو به معنای واقعی کلمه اذیت کرد بازگشت مقادیر در توابع بودش اگر اشتباه نکنم یک روز کاری کامل کل فضای سایبر رو بالا پایین کردم تا به نتیجه مطلوب رسیدم. حالا یه کم وقت اضافه پیدا کردم تو عیدی گفتم این مورد رو به منتشر کنیم تا اگر پارسی زبان عزیزی دوست داشت با nodejs کار کنه درگیر این مورد اذیت کننده نباشه.
نکته اول تو این مورد ما چیزی به نام retrun نداریم مثل خوده js که در مرورگر استفاده میکنید به اون معنی که باهاش آشنا هستید.
واما:
نکته دوم به جاش باید از callback استفاده کنید پس باید چهارچوب مفهومی که توی یادگرفته قبلی داشتین رو بذارین کنار.
callback چیست؟
به یاد دارم اولین باری که با این مفهوم برخورد کردم در RCE بود که با مفهوم TLS callback آشنا شدم واسم خیلی عجیب و جالب بود، حالا کار این TLS callback چی بود؟ این یه تابع بود که میتونست قبل از اجرا exe اجرا بشه و نامرد پروتکتور ها کلی کد AntiDebug میرختن توش حالا اگر این یه تیکه براتون سنگین بود نگران نباشید یه خاطره بود حالا واقعا callback چیست؟ در مفهوم عادی مثلا یکی تماس میگیره شما رد تماس میدین میگین call back you یعنی تماس متقابل برقرار میکنم اما در اصطلاح برنامه نویسی دارای مفاهیم زیر میتونه باشه:
- ارجاع دادن یک آرگومان به تابع دیگر
- احضار یک رویداد پس از یک یا چند رویداد
- یا تکه ای از یک تابع مثل آرگومان که میتونه توسط توابع دیگر کنترل بشه
همه این تعاریف میتونه صادق باشه یا حداقل یکیش صادق هستش به ajax زدن در jquery که حتما زدید توجه کنید اونجایی که جواب ajax رو میگیرد و روش کار میکند اون قسمت کال بک میباشد
بحث اصلی تعریف یک callback برای برگرداندن مقادیر
ما فرض میکنیم یه تابع داریم میخواد به mysql متصل بشود بعد ما متوجه شویم آیا اتصال موفق بوده یا خیر به کد زیر توجه کنید:
var myconnect: function (callback) { mysql = require('mysql'); this.dbh = mysql.createConnection({ host:'localhost', port: 3306, user: 'root', password: 'passwd', database: 'test' }); this.dbh.connect(function (err) { if (err) { console.log(err); callback(false); } else { callback(true); } }); },
اما ما یه تابع تعریف کردیم به نام myconnect خب حالا ما هیچ آرگومان ورودی قاعدتاْ نیاز نداریم اما برای این مقدار بازگشت داشته باشیم یه آرگومان اضافه میکنیم به نام callback خب حالا ما در ادامه تلاش میکنیم به mysql وصل شیم بعد نتیجه دو حالت بیشتر ندارد true و یا false پس ما توجه کنید نمیتونیم return کنیم پس حالا میایم از این روش استفاده میکنیم:
if (err) { callback(false); } else { callback(true); }
توجه کنید ما مقداری که نیاز داریم به بازگشت را در callback که نام آرگومان ما هست به صورت تابع می فرستیم
به همین سادگی
نحوه استفاده از این تابع:
تابع بالا فرض کنید:
myconnect(function(e){ console.log(e); });
ما میایم در آرگومان تابع myconnect به جای گذاشتن متغییر یه تابع تعریف میکنیم و e یه نام دلخواه هست که توسط callback پر میشه و در آخر نمایش می دهیم.
اما نکته آخر هر چند تعداد متغییر که دوست داشتین در callback میتوانید برگشت بدین و موقع استفاده هم باید به همون تعداد که پاس دادید تعریف کنید تا استفاده کنید البته اجبار نیست و اصول هست.
در راه پیشرفت موفق باشید و هرگز نا امید نباشید. 😛
دیدگاهتان را بنویسید لغو پاسخ