از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
Promises در Node.jsJavaScript تک رشته ای است، به این معنی که همه چیز، از جمله رویدادها، اجرا می شود. روی همان رشته اگر رشته آزاد نباشد، اجرای کد تا زمانی که آزاد شود به تأخیر می افتد. این می تواند یک گلوگاه برای برنامه ما باشد زیرا واقعاً می تواند باعث مشکلات جدی عملکرد شود. راه های مختلفی وجود دارد که ما از طریق آنها …
سرفصلهای مطلب
معرفی
جاوا اسکریپت است تک رشته ای، به این معنی که همه چیز، از جمله رویدادها، اجرا می شود روی همان رشته اگر رشته آزاد نباشد، اجرای کد تا زمانی که آزاد شود به تأخیر می افتد. این می تواند یک گلوگاه برای برنامه ما باشد زیرا واقعاً می تواند باعث مشکلات جدی عملکرد شود.
راه های مختلفی وجود دارد که می توانیم بر این محدودیت غلبه کنیم. در این مقاله، روش مدرن برای رسیدگی به وظایف ناهمزمان در جاوا اسکریپت را بررسی خواهیم کرد – Promise
س
Callbacks و Callback Hell
اگر شما یک توسعه دهنده جاوا اسکریپت هستید، احتمالاً شنیده اید، اگر از آن استفاده نکنید، پاسخ به تماس ها:
function hello() {
console.log('Hello World!');
}
setTimeout(hello, 5000);
این کد یک تابع را اجرا می کند، setTimeout()
، که منتظر زمان تعریف شده (بر حسب میلی ثانیه)، به عنوان آرگومان دوم است، 5000
. پس از گذشت زمان، تنها پس از آن تابع را اجرا می کند hello
، به عنوان اولین پارامتر به آن منتقل می شود.
تابع مثالی از a است تابع مرتبه بالاتر و تابع ارسال شده به آن a نامیده می شود پاسخ به تماس – تابعی که قرار است پس از اتمام اجرای یک تابع دیگر اجرا شود.
فرض کنید ما درخواستی را به یک API ارسال کردیم تا عکسهایی که بیشترین لایک را از حساب خود دریافت کردهاند را بازگرداند. احتمالاً باید منتظر پاسخ باشیم زیرا API/سرویس ممکن است قبل از بازگرداندن پاسخ محاسباتی را انجام دهد.
این به طور بالقوه می تواند زمان زیادی طول بکشد، و ما نمی خواهیم تا زمانی که منتظر پاسخ هستیم، موضوع را مسدود کنیم. درعوض، ما یک تماس برگشتی ایجاد خواهیم کرد که پس از دریافت پاسخ به آن اطلاع داده می شود.
تا آن زمان، بقیه کدها مانند ارائه پست ها و اعلان ها در حال اجرا هستند.
اگر تا به حال با تماس های برگشتی کار کرده اید، این احتمال وجود دارد که جهنم پاسخ به تماس را تجربه کرده باشید:
doSomething(function(x) {
console.log(x);
doSomethingMore(x, function(y) {
console.log(y);
doRestOfTheThings(y, function(z) {
console.log(z);
});
});
});
حالتی را تصور کنید که در آن از سرور درخواست می کنیم منابع متعددی را دریافت کند – یک شخص، دوستانش و پست های دوستش، نظرات مربوط به پست های هر یک از دوستان، پاسخ ها و غیره.
مدیریت این وابستگی های تودرتو می تواند به سرعت از کنترل خارج شود.
ما میتوانیم از جهنمهای برگشت به تماس جلوگیری کنیم و با استفاده از تماسهای ناهمزمان رسیدگی کنیم Promise
س
ایجاد یک وعده
Promise
s همانطور که از نام آن پیداست، تابعی است که کلمه خود را می دهد و مقداری در زمان بعدی بازگردانده می شود. این یک پروکسی برای مقداری است که ممکن است برگردانده نشود، اگر تابعی که انتظار داریم پاسخی از آن ارائه نشود.
این توابع ناهمزمان به جای برگرداندن مقادیر مشخص، a را برمیگردانند Promise
موضوعی که در مقطعی یا محقق می شود یا خیر.
اغلب، هنگام کدنویسی، مصرف می کنیم Promise
به جای ایجاد آنها. این کتابخانه ها/چارچوب ها هستند که ایجاد می کنند Promise
برای مصرف کنندگان است.
با این حال، خوب است درک کنیم که پشت ایجاد a چیست Promise
:
let promise = new Promise(function(resolve, reject) {
// Some imaginary 2000 ms timeout simulating a db call
setTimeout(()=> {
if (/* if promise can be fulfilled */) {
resolve({msg: 'It works', data: 'some data'});
} else {
// If promise can not be fulfilled due to some errors like network failure
reject(new Error({msg: 'It does not work'}));
}
}, 2000);
});
سازنده وعده یک آرگومان دریافت می کند – یک callback. پاسخ تماس می تواند یک تابع معمولی یا یک تابع فلش باشد. پاسخ به تماس دو پارامتر می گیرد – resolve
و reject
. هر دو مرجع تابع هستند. به callback، مجری نیز گفته می شود.
هنگامی که یک وعده ایجاد می شود، مجری بلافاصله اجرا می شود. قول با تماس حل می شود resolve()
اگر وعده وفا شود، و با دعوت رد شود reject()
اگر نتوان آن را برآورده کرد
هر دو resolve()
و reject()
یک استدلال بگیر – boolean
، string
، number
، array
، یا یک object
.
مصرف یک وعده
از طریق یک API، بگویید که ما مقداری داده از سرور درخواست کردهایم و مشخص نیست که چه زمانی برگردانده میشود – آیا اصلاً بازگردانده میشود یا خیر. این یک مثال کامل از زمانی است که ما از a استفاده می کنیم Promise
برای کمک به ما
با فرض اینکه متد سروری که تماس ما را مدیریت می کند a را برمی گرداند Promise
، می توانیم آن را مصرف کنیم:
promise.then((result) => {
console.log("Success", result);
}).catch((error) => {
console.log("Error", error);
})
همانطور که می بینیم ما دو روش زنجیره ای داریم – then()
و catch()
. اینها تعدادی از روش های مختلف ارائه شده توسط Promise
هدف – شی.
then()
زمانی اجرا می شود که همه چیز به خوبی پیش برود، یعنی وعده توسط آن محقق شود resolve()
روش. و اگر قول رد شد، catch()
متد با خطای ارسال شده به فراخوانی می شود reject
.
وعده های زنجیره ای
اگر دنباله ای از کارهای ناهمزمان را یکی پس از دیگری داشته باشیم که باید انجام شوند – هر چه تودرتو بیشتر باشد، کد گیج کننده تر می شود.
این ما را به جهنم برگشتی سوق می دهد که به راحتی می توان با زنجیر کردن چندین مورد از آن اجتناب کرد then()
مواد و روش ها روی یک مجرد Promise
d نتیجه:
promise.then(function(result) {
// Register user
return {account: 'blahblahblah'};
}).then(function(result) {
// Auto login
return {session: 'sjhgssgsg16775vhg765'};
}).then(function(result) {
// Present WhatsNew and some options
return {whatsnew: {}, options: {}};
}).then(function(result) {
// Remember the user Choices
return {msg: 'All done'};
});
همانطور که می بینیم نتیجه از طریق زنجیره عبور داده می شود then()
کنترل کننده ها:
- اولیه
promise
شی حل می شود - سپس
then()
کنترل کننده برای ثبت نام کاربر فراخوانی می شود - مقداری که برمی گرداند به بعدی ارسال می شود
then()
کنترل کننده برای ورود خودکار کاربر - … و غیره روی
همچنین then(handler)
ممکن است یک وعده ایجاد و بازگرداند.
توجه داشته باشید: اگرچه از نظر فنی ما می توان کاری مانند مثال ادامه دهید، می تواند نقطه زنجیر را از بین ببرد. اگرچه این تکنیک برای زمانی که نیاز به فراخوانی اختیاری روشهای ناهمزمان دارید میتواند خوب باشد:
let promise = new Promise(function(resolve, reject) {
setTimeout(() => resolve({msg: 'To do some more job'}), 1000);
});
promise.then(function(result) {
return {data: 'some data'};
});
promise.then(function(result) {
return {data: 'some other data'};
});
promise.then(function(result) {
return {data: 'some more data'};
});
کاری که ما در اینجا انجام می دهیم فقط اضافه کردن چندین کنترل کننده به یک وعده است که همه آنها process را result
به طور مستقل آنها نتیجه را به ترتیب به یکدیگر منتقل نمی کنند.
به این ترتیب، همه گردانندگان یک نتیجه را دریافت می کنند – نتیجه آن وعده – {msg: 'To do some more job'}
.
نتیجه
Promise
s، همانطور که از نام آن پیداست، تابعی است که “کلمه خود را می دهد” که یک مقدار در زمان بعدی برگردانده می شود. این یک پروکسی برای مقداری است که ممکن است برگردانده نشود، اگر تابعی که انتظار داریم پاسخی از آن ارائه نشود.
این توابع ناهمزمان به جای برگرداندن مقادیر مشخص، a را برمیگردانند Promise
موضوعی که در مقطعی یا محقق می شود یا خیر.
اگر با تماسهای برگشتی کار کردهاید، باید از معنای پاک و واضح آن قدردانی کنید Promise
س
بهعنوان یک توسعهدهنده Node/JavaScript، ما بیشتر با وعدهها سروکار خواهیم داشت. به هر حال، این یک دنیای ناهمزمان، پر از شگفتی است.
(برچسبها برای ترجمه)# جاوا اسکریپت
منتشر شده در 1403-01-24 17:03:04