تعامل همزمانی
تعامل همزمانی
یکی دیگر از شرایط تعامل همزمانی که ممکن است با آن مواجه شوید، گاهی اوقات “مسابقه” نامیده می شود، اما به درستی “چفت” نامیده می شود. با رفتار “فقط اولین نفر برنده” مشخص می شود. در اینجا، عدم قطعیت پذیرفتنی است، زیرا شما صریحاً می گویید که «مسابقه» تا خط پایان فقط یک برنده داشته باشد، اشکالی ندارد.
این کد شکسته را در نظر بگیرید:
var a;
function foo(x) {
a = x * 2;
baz();
} f
unction bar(x) {
a = x / 2;
baz();
} f
unction baz() {
console.log( a );
} /
/ ajax(..) is some arbitrary Ajax function given by a library
ajax( “http://some.url.1”, foo );
ajax( “http://some.url.2”, bar );
هر کدام (foo() یا bar()) آخرین بار اجرا شود نه تنها مقدار اختصاص داده شده را از دیگری بازنویسی می کند، بلکه فراخوانی به baz() را نیز کپی می کند (احتمالاً نامطلوب).
بنابراین، میتوانیم تعامل را با یک چفت ساده هماهنگ کنیم تا فقط اولین مورد را از بین ببریم:
var a;
function foo(x) {
if (!a) {
a = x * 2;
baz();
}
} f
unction bar(x) {
if (!a) {
a = x / 2;
baz();
}
} f
unction baz() {
console.log( a );
} /
/ ajax(..) is some arbitrary Ajax function given by a library
ajax( “http://some.url.1”, foo );
ajax( “http://some.url.2”, bar );
شرط if (!a) فقط به اولین مورد از foo() یا bar() اجازه عبور می دهد و فراخوانی دوم (و در واقع هر بعدی) صرفا نادیده گرفته می شود. فقط هیچ فضیلتی در مقام دوم بودن وجود ندارد!
توجه: در تمام این سناریوها، ما از متغیرهای سراسری برای اهداف تصویرسازی ساده استفاده کردهایم، اما هیچ چیزی در مورد استدلال ما در اینجا وجود ندارد که به آن نیاز داشته باشد. تا زمانی که توابع مورد نظر بتوانند به متغیرها (از طریق scope) دسترسی داشته باشند، همانطور که در نظر گرفته شده است کار خواهند کرد. تکیه بر متغیرهای دارای دامنه واژگانی (به عنوان Scope & Closures سری این کتاب مراجعه کنید)، و در واقع متغیرهای سراسری مانند این مثالها، یکی از نکات منفی آشکار این اشکال هماهنگی همزمانی است. همانطور که از چند فصل بعدی می گذریم، راه های هماهنگی دیگری را خواهیم دید که از این نظر بسیار تمیزتر هستند.
مشارکت
یکی دیگر از بیان هماهنگی همزمانی «همراهی تعاونی» نام دارد. در اینجا، تمرکز چندان روی تعامل از طریق اشتراک گذاری ارزش در حوزه ها نیست (اگرچه بدیهی است که هنوز مجاز است!). هدف این است که یک “فرآیند” طولانی مدت
را انجام دهیم و آن را به مراحل یا دسته تقسیم کنیم تا سایر “فرآیندهای” همزمان فرصتی برای تداخل عملیات خود در صف حلقه رویداد داشته باشند.
به عنوان مثال، یک کنترل کننده پاسخ Ajax را در نظر بگیرید که برای تبدیل مقادیر باید فهرست طولانی از نتایج را اجرا کند. برای کوتاه نگه داشتن کد از Array#map(..) استفاده می کنیم:
var res = [];
// `response(..)` receives array of results from the Ajax call
function response(data) {
// add onto existing `res` array
res = res.concat(
// make a new transformed array with all `data` values doubled
data.map( function(val){
return val * 2;
} )
);
}
// ajax(..) is some arbitrary Ajax function given by a library
ajax( “http://some.url.1”, response );
ajax( “http://some.url.2”, response );
قوانین ارسال دیدگاه در سایت