استدلال در مورد یک مقدار
استدلال در مورد یک مقدار
وقتی کدی را برای استدلال در مورد یک مقدار می نویسید،
مانند انجام ریاضیات روی یک عدد، خواه متوجه شوید یا نه، چیزی بسیار اساسی را در مورد آن مقدار فرض کرده اید، که این است که این مقدار از قبل مشخص شده است:
var x, y = 2;
console.log( x + y ); // NaN <– because `x` isn’t set yet
عملیات x + y فرض می کند که هر دو x و y از قبل تنظیم شده اند. در شرایطی که به زودی توضیح خواهیم داد، فرض می کنیم که مقادیر x و y قبلا حل شده اند.
بیهوده است که انتظار داشته باشیم که اپراتور + به خودی خود به نحوی جادویی قادر به شناسایی و منتظر ماندن تا زمانی که هر دو x و y حل و فصل شوند (معروف به آماده)، تنها پس از آن عملیات را انجام دهد. اگر عبارات مختلف اکنون تمام شوند و برخی دیگر بعداً تمام شوند، باعث هرج و مرج در برنامه می شود، درست است؟
اگر یکی (یا هر دو) هنوز تمام نشده باشد، چگونه می توانید در مورد روابط بین دو عبارت استدلال کنید؟ اگر عبارت 2 متکی باشد که عبارت 1 تمام شده است، فقط دو نتیجه وجود دارد: یا عبارت 1 در حال حاضر تمام شد و همه چیز به خوبی پیش می رود، یا عبارت 1 هنوز تمام نشده است، و بنابراین عبارت 2 شکست می خورد.
اگر این نوع چیزها از فصل 1 آشنا به نظر می رسد، خوب است!
بیایید به عملیات ریاضی x + y خود برگردیم. تصور کنید راهی برای گفتن “x و y را اضافه کنید” وجود داشت، اما اگر یکی از آنها هنوز آماده نیست، فقط منتظر بمانید تا آماده شوند. در اسرع وقت آنها را اضافه کنید.
ممکن است مغز شما به سمت تماسهای برگشتی رفته باشد. باشه پس…
function add(getX,getY,cb) {
var x, y;
getX( function(xVal){
x = xVal;
// both are ready?
if (y != undefined) {
cb( x + y ); // send along sum
}
} );
getY( function(yVal){
y = yVal;
// both are ready?
if (x != undefined) {
cb( x + y ); // send along sum
}
} );
}
// `fetchX()` and `fetchY()` are sync or async
// functions
add( fetchX, fetchY, function(sum){
console.log( sum ); // that was easy, huh?
} );
فقط یک لحظه وقت بگذارید
تا زیبایی (یا فقدان آن) آن قطعه در آن غرق شود (با حوصله سوت می زند).
در حالی که زشتی آن غیرقابل انکار است، نکته بسیار مهمی در مورد این الگوی همگام وجود دارد.
در آن قطعه، x و y را بهعنوان مقادیر آینده در نظر میگیریم، و یک عملیات add(..) را بیان میکنیم که (از بیرون) اهمیتی ندارد که x یا y یا هر دو فوراً در دسترس هستند یا خیر. به عبارت دیگر، حال و بعد را عادی می کند، به طوری که می توانیم به یک نتیجه قابل پیش بینی از عملیات add(..) تکیه کنیم.
با استفاده از یک add(..) که از لحاظ زمانی سازگار است – در زمانهای کنونی و در زمانهای بعدی یکسان رفتار میکند – استدلال کد async بسیار آسانتر است.
به بیان ساده تر: برای رسیدگی به هر دو حالت اکنون و بعد، ما هر دو را بعداً انجام می دهیم: همه عملیات ناهمگام می شوند.
البته، این رویکرد مبتنی بر تماسهای خشن چیزهای زیادی را برای دلخواه باقی میگذارد. این فقط اولین قدم کوچک به سوی درک مزایای استدلال در مورد ارزش های آینده بدون نگرانی در مورد جنبه زمانی در دسترس بودن یا نبودن آن است.
قوانین ارسال دیدگاه در سایت