یکی دیگر از مسائل اعتماد “خیلی زود” نامیده می شود
یکی دیگر از مسائل اعتماد “خیلی زود” نامیده می شود
در شرایط خاص برنامه، این ممکن است در واقع شامل فراخوانی قبل از تکمیل برخی از وظایف حیاتی باشد. اما به طور کلیتر، مشکل در برنامههای کاربردی آشکار است که میتوانند پاسخ تماسی را که اکنون ارائه میدهید (به صورت همزمان) یا بعداً (ناهمزمان) فراخوانی کنند.
این عدم قطعیت در مورد رفتار همگام یا ناهمگام تقریباً همیشه منجر به ردیابی اشکالات بسیار دشوار می شود. در برخی محافل، هیولای خیالی القا کننده جنون به نام زالگو برای توصیف کابوس های همگام/ناهمگام استفاده می شود. “زالگو را آزاد نکن!” یک فریاد معمول است، و به توصیه های بسیار درستی منجر می شود: همیشه تماس ها را به صورت ناهمزمان فراخوانی کنید، حتی اگر “فورا” در نوبت بعدی حلقه رویداد باشد، به طوری که همه تماس ها به طور قابل پیش بینی ناهمگام باشند.
توجه: برای اطلاعات بیشتر در مورد زالگو، اورن گولان «زالگو را آزاد نکن!» ببینید.
(https://github.com/oren/oren.github.io/blob/master/posts/zalgo.md) و اسحاق ز. شلوتر
“طراحی API برای ناهمزمانی”(http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony).
در نظر بگیرید:
function result(data) {
console.log( a );
}
var a = 0;
ajax( “..pre-cached-url..”, result );
a++;
آیا این کد 0 (همگام سازی فراخوانی برگشت به تماس) یا 1 (فرخوان برگشت به تماس غیرهمگام) را چاپ می کند؟ بستگی به شرایط دارد.
می توانید ببینید که غیرقابل پیش بینی بودن Zalgo چقدر سریع می تواند هر برنامه JS را تهدید کند. بنابراین، صدای احمقانه “هرگز زالگو را آزاد نکن” در واقع توصیه فوق العاده رایج و محکمی است.
همیشه ناهمگام باشید
اگر ندانید که آیا API مورد نظر همیشه ناهمگام اجرا می شود یا خیر؟ می توانید ابزاری مانند این asyncify(..) proof-of-concept اختراع کنید:
function asyncify(fn) {
var orig_fn = fn,
intv = setTimeout( function(){
intv = null;
if (fn) fn();
}, 0 )
;
fn = null;
return function() {
// firing too quickly, before `intv` timer has fired to
// indicate async turn has passed?
if (intv) {
fn = orig_fn.bind.apply(
orig_fn,
// add the wrapper’s `this` to the `bind(..)`
// call parameters, as well as currying any
// passed in parameters
[this].concat( [].slice.call( arguments ) )
);
}
// already async
else {
// invoke original function
orig_fn.apply( this, arguments );
}
};
}
شما از asyncify(..) مانند این استفاده می کنید:
function result(data) {
console.log( a );
}
var a = 0;
ajax( “..pre-cached-url..”, asyncify( result ) );
a++;
چه درخواست Ajax در حافظه نهان باشد و تصمیم بگیرد که فوراً تماس برگشتی را فراخوانی کند، یا باید از طریق سیم واکشی شود و در نتیجه بعداً به صورت ناهمزمان تکمیل شود، این کد همیشه به جای 0 خروجی 1 می دهد – نتیجه (..) نمی تواند کمک کند. اما به صورت ناهمزمان فراخوانی شود، به این معنی که a++ قبل از اجرای نتیجه (..) فرصت اجرا دارد.
بله، یکی دیگر از اعتماد صادر شده “حل”شد! اما ناکارآمد است، و باز هم دیگ بخار پف کرده تر برای سنگین کردن پروژه شما.
این فقط داستان است، بارها و بارها، با تماس ها. آنها تقریباً می توانند هر کاری را که شما بخواهید انجام دهند، اما شما باید مایل باشید که برای به دست آوردن آن سخت کار کنید، و اغلب این تلاش بسیار بیشتر از آن چیزی است که می توانید یا باید برای چنین استدلال کدی خرج کنید.
قوانین ارسال دیدگاه در سایت