تاریخ انتشار: دوشنبه, ۵ خرداد ۱۳۹۹، ۰۴:۳۵ ب.ظ نویسنده: محمدیان

 مثالی ساده از کال بک فانکشن

میخواهم تابعی ایجاد کنم که نتیجه ضرب 2 عدد را به من بدهد و سپس بتوانم با این نتیجه تابع دیگری را اجرا کنم. بنابراین:

function calc(val1,val2,cb){
    let result = val1*val2;
    return cb(result)
}

calc(5,6,function(result){
    console.log(result)
})

مثالی ساده از پرامیس Promise

const random = ()=>{
    return Promise.resolve(Math.random());
}

random().then(val=>{
    return val+5;
}).then(val=>{
    return Math.round(val)
}).then(val=>{
    console.log(val)
})
const showNum = Promise.resolve('56');

showNum.then(val=>console.log(val))
function calc(val1,val2){
    return val1*val2;
}

let exe = (val1,val2)=>{
    let p = new Promise((res:any,rej:any)=>{
        const result = calc(val1,val2);
        if(result){
            res(result)
        }else{
            rej('Problem on execut.')
        }
    })

    return p;
}

exe(5,6).then(res=>{
    console.log(res)
})

وقتی داده ها آماده نیستند و مقداری زمان برای آماده سازی آن ها نیاز است. یک پرامیس بازگشت میدهیم، پرامیس نیز قول میدهد که هرگاه داده مورد نظر ما آماده بود، اطلاع دهد.

مثالی ساده از async, await

const calc = (val:number)=>{
    return new Promise((res,rej)=>{
        res(val*5);
    })
}

const loger = async(num:number)=>{
    const result = await calc(num);
    console.log(result)
}

loger(2)

یکی از مزایای async و await اینه که await هر داده ای که به دستش برسه رو تحویل میده، اگه پرامیس باشه صبر میکنه که پرامیس وضعیتش تغییر کنه و کارش رو انجام بده و اگر هم پرامیس نباشه که داده رو همون موقع به صورت async تحویل میده. به نظر من دیگه از این بهتر نمیشه. انگار که نه انگار داری به صورت async با داده ها کار میکنی. واقعاً فوق العاده اس.

مثال فوق بدون پرامیس :

const calc = (val)=>{
    return val*5;
}

const loger = async(num)=>{
    const result = await calc(num);
    console.log(result)
}

loger(5)

توجه داشته باشید که هنوز هم میتوان به صورت زنجیره then به داده دسترسی داشت. به شرط اینکه درون تابع async نهایتاً از return استفاده کنیم. و داده را برگشت دهیم.

 

مثالی دیگر از Promise:

function getUser(id){
    return new Promise((res,rej)=>{
        res('database is ready---> user is: '+id)
    })
}
setTimeout(()=>{
    getUser(150).then(user=>{
        console.log(user);
    })
},2000)

 

تاریخ انتشار: سه شنبه, ۳۰ ارديبهشت ۱۳۹۹، ۰۷:۴۸ ق.ظ نویسنده: محمدیان

تفاوت همزمان و ناهمزمان

فرق اساسی Async با Sync در زمان اجرای دستورات است. در Sync یک درخواست بلافاصله اجرا می شود و بقیه سیستم باید منتظر پایان آن بماند. اما در Async درخواست به سیستم ارسال میشود و سیستم عامل قول میدهد که پایان آن را  اعلام کند اما اینکه دقیقا کی انجام میشود معلوم نیست.

استفاده از Async به معنی سریعتر شدن اجرای برنامه نیست. تضمینی وجود ندارد که متدهای Async به صورت موازی در Thread مجزا اجرا شوند.تصمیم گیری آن به عهده ی سیستم است. در واقع Async با برنامه نویسی موازی فرق دارد. در برنامه نویسی موازی سیستم عامل را مجبور می کنید از چند Thread جداگانه برای اجرای عملیات استفاده کند اما در Async این انتخاب به عهده ی سیستم عامل است.

از آنجا که زمان پایان در Async مشخص نیست Thread بعد از ارسال Task به سیستم عامل آزاد میشود و می تواند Request جدیدی را دریافت کند. می توان گفت در حالت Sync منابع سیستم بعد از پایان یک Request آزاد میشود اما در Async بعد از شروع  Request آزاد میشود. با این روش صف زودتر پیش میرود و احتمال اینکه درخواستی به علت زمان طولانی شدن زمان انتظار برگشت بخورد کمتر می شود.

در Async کار آهسته و پیوسته پیش میرود و همیشه حرکت رو به جلو وجود دارد. اما در Sync پیشرفت مقطعی است. وقتی ترافیک سرور بالا می رود عدم پیشرفت به خطای Server Time Out منجر میشود. در سرور Sync این حالت تا چند برابر (به صورت توانی) زودتر پیش می آید.

نتیجه

در وب توصیه میشود از متدهای Async استفاده کنید. معمولا پیاده سازی متدهای Async پیچیده تر است و کد نویسی آن زمان بیشتری می برد. اما در این روش منابع سرور به سرعت آزاد میشود و می تواند به Request های بیشتری پاسخ دهد. مخصوصا زمانی که با فایل یا دیتابیس کار می کنید.

 

منبع : کدهک