برای طرح سوال و دسترسی به آموزش ها  کانال ما در تلگرام بپویندید  

callback و بازگشت تابع در nodejs javascript

به نام دانای بر حق

 

مقدمه

به یاد دارم زمانی که 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 میتوانید برگشت بدین و موقع استفاده هم باید به همون تعداد که پاس دادید تعریف کنید تا استفاده کنید البته اجبار نیست و اصول هست.

در راه پیشرفت موفق باشید و هرگز نا امید نباشید. 😛


انتشار

در

,

توسط

نظرات

4 پاسخ به “callback و بازگشت تابع در nodejs javascript”
  1. SadeghPM

    خیلی عالی .
    فقط میخواستم بگم یکم مدرن تر برای این راه حل Promise هست.
    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
    به عنوان مثال تابع شما به صورت زیر میشه :

    //The Promise object is used for asynchronous computations. A Promise represents a value which may be available now, or in the future, or never.
        var myconnect: new Promise (resolve,reject) {
    
            mysql = require('mysql');
    
            var dbh = mysql.createConnection({
                host:'localhost',
                port: 3306,
                user: 'root',
                password: 'passwd',
                database: 'test'
            });
    
            dbh.connect(function (err) {
    
                if (err) {
                    reject(reason);
    
                } else {
    
                    resolve(dbh);
                }
            });
    
        },
    

    و موقع استفاده هم :

    myconnect.then(function(connection){
                    //use db connection
                  },function(reason){
                    //show error reason
                  }
    );
    
    1. ‌A1Gard

      خیلی هم عالی همیشه صدها قدم از ما جلو تر هستی صادق جان مرسی از نکته ارزنده ات.

  2. Sajjad Brj

    سلام دوست عزیز
    پیشنهاد میدم ویدیوهای Brad Traversy برای جاوا اسکریپت و نودجی اس رو ببینی ، خیلی خوب در این مورد callback و Promise توضیح میده.

    1. ‌A1Gard

      سلام مرسی از توضیحاتتون حتما فرصتی بود

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *