সমস্ত আধুনিক ব্রাউজার বাস্তবায়নে জাভাস্ক্রিপ্ট একক থ্রেডড হিসাবে পরিচিত, তবে এটি কোনও মানটিতে নির্দিষ্ট বা এটি কেবল traditionতিহ্য দ্বারা? জাভাস্ক্রিপ্ট সর্বদা একক থ্রেডযুক্ত ধরে নেওয়া কি সম্পূর্ণ নিরাপদ?
সমস্ত আধুনিক ব্রাউজার বাস্তবায়নে জাভাস্ক্রিপ্ট একক থ্রেডড হিসাবে পরিচিত, তবে এটি কোনও মানটিতে নির্দিষ্ট বা এটি কেবল traditionতিহ্য দ্বারা? জাভাস্ক্রিপ্ট সর্বদা একক থ্রেডযুক্ত ধরে নেওয়া কি সম্পূর্ণ নিরাপদ?
উত্তর:
এটা একটা ভালো প্রশ্ন. আমি "হ্যাঁ" বলতে পছন্দ করি। পারছি না।
স্ক্রিপ্টগুলি (*) এর জন্য জাভাস্ক্রিপ্ট সাধারণত মৃত্যুদন্ড কার্যকর করার একক থ্রেড হিসাবে বিবেচিত হয়, যাতে আপনার ইনলাইন স্ক্রিপ্ট, ইভেন্ট শ্রোতা বা সময়সীমা প্রবেশ করা হয়, আপনি আপনার ব্লক বা ফাংশনটির শেষে থেকে ফিরে না আসা পর্যন্ত আপনি সম্পূর্ণ নিয়ন্ত্রণে থাকেন।
(*: ব্রাউজারগুলি সত্যই কোনও ওএস-থ্রেড ব্যবহার করে তাদের জেএস ইঞ্জিনগুলি বাস্তবায়িত করে, বা অন্যান্য সীমাবদ্ধ থ্রেড-অফ-এক্সিকিউশন ওয়েব ওয়ার্কার্স দ্বারা প্রবর্তিত হয়েছে কিনা এই প্রশ্নটিকে উপেক্ষা করে)
যাইহোক, বাস্তবে এটি একেবারেই সত্য নয় , চতুষ্পদ কদর্য উপায়ে।
সর্বাধিক সাধারণ ঘটনা হ'ল তাত্ক্ষণিক ঘটনা। ব্রাউজারগুলি এগুলি তত্ক্ষণাত্ জ্বালিয়ে দেবে যখন আপনার কোড তাদের কারণ হিসাবে কিছু করে:
var l= document.getElementById('log');
var i= document.getElementById('inp');
i.onblur= function() {
l.value+= 'blur\n';
};
setTimeout(function() {
l.value+= 'log in\n';
l.focus();
l.value+= 'log out\n';
}, 100);
i.focus();
<textarea id="log" rows="20" cols="40"></textarea>
<input id="inp">
log in, blur, log out
আইই ব্যতীত সকলের ফলাফল । আপনি focus()
সরাসরি ডেকেছিলেন বলে এই ইভেন্টগুলি কেবল আগুন দেয় না , আপনি কল করেছিলেন alert()
বা পপ-আপ উইন্ডোটি খোলা বা ফোকাসকে সরিয়ে দেয় এমন অন্য কোনও কারণেই এগুলি ঘটতে পারে ।
এটি অন্যান্য ইভেন্টগুলিরও ফলস্বরূপ হতে পারে। উদাহরণস্বরূপ একজন i.onchange
শ্রোতা যুক্ত করুন এবং focus()
কলটি ফোকাস করার আগে ইনপুটটিতে কিছু টাইপ করুন এবং লগ অর্ডারটি log in, change, blur, log out
কেবল অপেরা ছাড়া যেখানে এটি log in, blur, log out, change
এবং আইই যেখানে রয়েছে (এমনকি আরও কম স্পষ্টভাবেও নয়) log in, change, log out, blur
।
একইভাবে click()
এমন কোনও উপাদানকে কল করা যা এটি সরবরাহ করে তা onclick
সমস্ত ব্রাউজারে তাত্ক্ষণিকভাবে হ্যান্ডলারকে কল করে (কমপক্ষে এটি সামঞ্জস্যপূর্ণ!)।
(আমি সরাসরি ব্যবহার করছি on...
এখানে ইভেন্ট হ্যান্ডলার বৈশিষ্ট্য, কিন্তু একই সঙ্গে ঘটে addEventListener
এবং attachEvent
।)
আপনার কোডটি থ্রেড করা অবস্থায় ইভেন্টগুলি আগুন দিতে পারে এমন পরিস্থিতিতেও রয়েছে, যদিও আপনি এটিকে উস্কে দেওয়ার জন্য কিছুই করেননি done একটি উদাহরণ:
var l= document.getElementById('log');
document.getElementById('act').onclick= function() {
l.value+= 'alert in\n';
alert('alert!');
l.value+= 'alert out\n';
};
window.onresize= function() {
l.value+= 'resize\n';
};
<textarea id="log" rows="20" cols="40"></textarea>
<button id="act">alert</button>
হিট করুন alert
এবং আপনি একটি মডেল সংলাপ বাক্স পাবেন। আপনি সেই কথোপকথনটি খারিজ না করা পর্যন্ত আর কোনও স্ক্রিপ্ট কার্যকর হবে না, হ্যাঁ? নাঃ। মূল উইন্ডোটি পুনরায় আকার দিন এবং আপনি alert in, resize, alert out
টেক্সারিয়ায় পাবেন।
আপনি যদি ভাবেন যে কোনও উইন্ডোটির আকার পরিবর্তন করা অসম্ভব তবে একটি মডেল সংলাপ বাক্স রয়েছে তবে এটি নয়: লিনাক্সে, আপনি উইন্ডোটি যতটা পছন্দ পরিবর্তন করতে পারেন; উইন্ডোজে এটি এত সহজ নয়, তবে আপনি স্ক্রিনের রেজোলিউশনটি বৃহত্তর থেকে ছোট্ট যেখানে উইন্ডোটি ফিট করে না সেখানে পরিবর্তন করে এটির আকার পরিবর্তন করতে পারে।
আপনি ভাবতে পারেন, ভাল, এটি কেবলমাত্র resize
(এবং সম্ভবত আরও কয়েকটি মতো scroll
) ব্যবহারকারীর ব্রাউজারের সাথে সক্রিয় যোগাযোগের সময় ব্রাউজারের সাথে সক্রিয় না থাকার কারণে আগুন লাগতে পারে কারণ স্ক্রিপ্টটি থ্রেড করা হয়েছে। এবং একক উইন্ডোর জন্য আপনি সঠিক হতে পারে। আপনি ক্রস উইন্ডো স্ক্রিপ্টিং করার সাথে সাথেই তা পট হয়ে যাবে। সাফারি ব্যতীত সমস্ত ব্রাউজারগুলির জন্য, যা কোনও উইন্ডোজ / ট্যাব / ফ্রেমগুলিকে ব্যস্ত রাখার সময় অবরুদ্ধ করে রাখে, আপনি অন্য নথির কোড থেকে একটি নথির সাথে আলাপচারিতা করতে পারেন, এক্সিকিউশনের একটি পৃথক থ্রেডে চলতে এবং কোনও সম্পর্কিত ইভেন্ট হ্যান্ডলারের কারণ হতে পারে আগুন।
স্ক্রিপ্ট এখনও থ্রেড করা হয় এমন জায়গাগুলি যেখানে আপনার উত্পন্ন হওয়ার কারণ হতে পারে সেগুলি উত্থাপিত হতে পারে:
যখন মোডাল পপআপ ( alert
, confirm
, prompt
), খোলা সমস্ত ব্রাউজার কিন্তু অপেরা মধ্যে রয়েছে;
showModalDialog
এটি সমর্থনকারী ব্রাউজারগুলির সময় ;
"এই পৃষ্ঠায় একটি স্ক্রিপ্ট ব্যস্ত থাকতে পারে ..." কথোপকথন বাক্স, এমনকি আপনি যদি স্ক্রিপ্টটি চালিয়ে যেতে চান, পুনরায় আকার এবং ঝাপসা করার মতো ইভেন্টগুলিকে অনুমতি দেয় এবং এমনকি স্ক্রিপ্টটির মাঝখানে থাকাকালীন পরিচালনাও করা যায় dialogue অপেরা ব্যতীত ব্যস্ত লুপ।
আমার জন্য কিছুক্ষণ আগে, আইই তে সান জাভা প্লাগইন সহ, অ্যাপলেটের যে কোনও পদ্ধতি কল করা ঘটনাগুলিকে ফায়ার করতে এবং স্ক্রিপ্টটিকে পুনরায় প্রবেশের অনুমতি দিতে পারে। এটি সর্বদা সময়-সংবেদনশীল ত্রুটি ছিল এবং এটি সম্ভব সূর্যের পর থেকেই এটি ঠিক করা হয়েছে (আমি অবশ্যই এটি আশা করি)।
সম্ভবত আরও কিছুক্ষণ হয়ে গেছে যখন আমি এটি পরীক্ষা করেছি এবং তখন থেকে ব্রাউজারগুলি জটিলতা অর্জন করেছে।
সংক্ষেপে, জাভাস্ক্রিপ্ট বেশিরভাগ ব্যবহারকারীদের কাছে প্রদর্শিত হয়, বেশিরভাগ সময়, কার্যকরভাবে চালিত একক থ্রেড ইভেন্ট চালিত। বাস্তবে এর কোনও জিনিস নেই has এটি কতটা কেবল একটি বাগ এবং কতটা ইচ্ছাকৃত নকশা তা পরিষ্কার নয় তবে আপনি যদি জটিল অ্যাপ্লিকেশনগুলি লিখে থাকেন, বিশেষত ক্রস উইন্ডো / ফ্রেম-স্ক্রিপ্টিংগুলি, তবে এটি আপনাকে দংশিত করতে পারে এমন প্রতিটি সুযোগ রয়েছে - এবং মাঝে মাঝে, হার্ড-টু-ডিবাগ উপায়।
যদি খারাপটি সবচেয়ে খারাপের দিকে চলে আসে তবে আপনি সমস্ত ইভেন্টের প্রতিক্রিয়াগুলিকে পরোক্ষ করে সম্মতিযুক্ত সমস্যাগুলি সমাধান করতে পারেন। কোনও ইভেন্ট এলে এটিকে একটি সারিতে ফেলে দিন এবং setInterval
ক্রিয়াকলাপটি পরে কোনও ক্রিয়ায় ডিল করুন । আপনি যদি এমন একটি ফ্রেমওয়ার্ক লিখে থাকেন যা আপনি জটিল অ্যাপ্লিকেশনগুলি দ্বারা ব্যবহার করার ইচ্ছা করেন তবে এটি করা ভাল পদক্ষেপ হতে পারে। postMessage
ভবিষ্যতে ক্রস-ডকুমেন্ট স্ক্রিপ্টিংয়ের ব্যথাটিও আশাবাদী করবে।
blur
আসার পরে IE গুলি ছোঁড়ে ।
আমি হ্যাঁ বলব - কারণ কোনও ব্রাউজারের জাভাস্ক্রিপ্ট ইঞ্জিন যদি এটি অবিচ্ছিন্নভাবে চালিত হয় তবে কার্যত সমস্ত বিদ্যমান (কমপক্ষে সমস্ত অ-তুচ্ছ) জাভাস্ক্রিপ্ট কোডটি ভেঙে যায়।
এই সত্যটি যোগ করুন যে এইচটিএমএল 5 ইতিমধ্যে ওয়েব ওয়ার্কারদের নির্দিষ্ট করেছে (মাল্টি-থ্রেডিং জাভাস্ক্রিপ্ট কোডের জন্য একটি স্পষ্ট, মানকৃত এপিআই) বেসিক জাভাস্ক্রিপ্টে মাল্টি-থ্রেডিং প্রবর্তন করা বেশিরভাগ অর্থহীন।
( অন্য মন্তব্যকারীদের কাছে দ্রষ্টব্য: যদিও setTimeout/setInterval
, এইচটিটিপি-অনুরোধ অনলোড লোড ইভেন্টস (এক্সএইচআর), এবং ইউআই ইভেন্টগুলি (ক্লিক, ফোকাস, ইত্যাদি) বহু-থ্রেডনেসডের একটি অদ্ভুত ছাপ সরবরাহ করে - এগুলি এখনও সমস্ত একক সময়রেখায় চালিত হয় - একটিতে একটি সময় - সুতরাং এমনকি যদি আমরা তাদের মৃত্যুদন্ড কার্যকর করার আদেশ আগেই জানি না, ইভেন্ট হ্যান্ডলার, সময়সীমাবদ্ধ ফাংশন বা এক্সএইচআর কলব্যাকের সম্পাদনার সময় বাহ্যিক অবস্থার পরিবর্তন হওয়ার বিষয়ে চিন্তা করার দরকার নেই))
হ্যাঁ, যদিও আপনি এখনও সেট-ইনটারওয়াল এবং এক্সএমএলএইচটিপি কলব্যাকের মতো অ্যাসিনক্রোনাস এপিআই ব্যবহার করার সময় সাম্প্রতিক প্রোগ্রামিংয়ের (মূলত রেসের শর্তাদি) কিছু সমস্যা ভুগতে পারেন।
আমি বলব যে স্পেসিফিকেশন কাউকে এমন এক ইঞ্জিন তৈরি করতে বাধা দেয় না যা একাধিক থ্রেডগুলিতে জাভাস্ক্রিপ্ট চালায় , অংশীদারি অবজেক্টের স্থিতিতে অ্যাক্সেসের জন্য সিঙ্ক্রোনাইজেশন করার জন্য কোডের প্রয়োজন।
আমি মনে করি যে একক থ্রেডযুক্ত নন-ব্লকিং দৃষ্টান্ত ব্রাউজারগুলিতে জাভাস্ক্রিপ্ট চালানোর প্রয়োজনে এসেছে যেখানে ইউআই কখনই ব্লক করা উচিত নয়।
নোডেজ ব্রাউজারগুলির পদ্ধতির অনুসরণ করেছে ।
রাইনো ইঞ্জিন তবে বিভিন্ন থ্রেডে চলমান জেএস কোডকে সমর্থন করে । ফাঁসিগুলি প্রসঙ্গ ভাগ করতে পারে না, তবে তারা সুযোগ ভাগ করে নিতে পারে। এই নির্দিষ্ট ক্ষেত্রে ডকুমেন্টেশন বলে:
... "গণ্ডার গ্যারান্টী জাভাস্ক্রিপ্ট অবজেক্টের বৈশিষ্ট্য ব্যবহারের থ্রেড জুড়ে পারমাণবিক আছে, কিন্তু দেখা যায় না একই time.If দুটি স্ক্রিপ্ট একযোগে একই সুযোগ ব্যবহার একই সুযোগ নির্বাহ স্ক্রিপ্টের জন্য কোন গ্যারান্টী, স্ক্রিপ্ট হয় অংশীদারি ভেরিয়েবলগুলিতে যে কোনও অ্যাক্সেস সমন্বয় করার জন্য দায়ী ""
রাইনো ডকুমেন্টেশন পড়া থেকে আমি এই সিদ্ধান্তে পৌঁছেছি যে কারও পক্ষে জাভাস্ক্রিপ্ট এপিআই লেখা সম্ভব হতে পারে যা নতুন জাভাস্ক্রিপ্ট থ্রেড তৈরি করে, তবে এপিআই রাইনো-নির্দিষ্ট হবে (যেমন নোড কেবল একটি নতুন প্রক্রিয়া তৈরি করতে পারে)।
আমি কল্পনা করেছি যে জাভাস্ক্রিপ্টে একাধিক থ্রেড সমর্থন করে এমন কোনও ইঞ্জিনের জন্যও স্ক্রিপ্টগুলির সাথে সামঞ্জস্যতা থাকা উচিত যা মাল্টি-থ্রেডিং বা ব্লকিং বিবেচনা করে না।
Concearning ব্রাউজার এবং nodejs আমি এটা দেখুন:
সুতরাং, ব্রাউজারগুলি এবং নোডেজগুলির ক্ষেত্রে (এবং সম্ভবত অন্যান্য ইঞ্জিনগুলি প্রচুর পরিমাণে) জাভাস্ক্রিপ্টটি মাল্টিথ্রেড নয় তবে ইঞ্জিনগুলি সেগুলি নিজেরাই ।
ওয়েব-কর্মীদের উপস্থিতি আরও ন্যায়সঙ্গত করে যে জাভাস্ক্রিপ্টটি বহু-থ্রেডড হতে পারে, এই অর্থে যে কেউ জাভাস্ক্রিপ্টে কোড তৈরি করতে পারে যা পৃথক থ্রেডে চলবে।
তবে: ওয়েব-কর্মীরা executionতিহ্যবাহী থ্রেডগুলির সমস্যাগুলিকে ত্রুটিযুক্ত করে না যারা কার্যকর করার প্রসঙ্গে ভাগ করতে পারে। উপরের 2 এবং 3 বিধিগুলি এখনও প্রয়োগ হয় তবে এবার থ্রেডেড কোডটি জাভাস্ক্রিপ্টে ব্যবহারকারী (জেএস কোড লেখক) তৈরি করেছেন।
কেবল বিবেচনার বিষয় হ'ল দক্ষতা (এবং একমত নয় ) দৃষ্টিকোণ থেকে স্পাউড থ্রেডের সংখ্যা । নিচে দেখ:
কর্মী ইন্টারফেসটি সত্যিকারের ওএস-স্তরের থ্রেডগুলিকে তৈরি করে এবং মনোযোগী প্রোগ্রামাররা উদ্বিগ্ন হতে পারে যে যদি আপনি সতর্ক না হন তবে সম্মতি আপনার কোডটিতে "আকর্ষণীয়" প্রভাবের কারণ হতে পারে।
তবে যেহেতু ওয়েব কর্মীরা সাবধানতার সাথে অন্যান্য থ্রেডের সাথে যোগাযোগের পয়েন্টগুলি নিয়ন্ত্রণ করেছে , তাই এটি সম্মতিযুক্ত সমস্যা তৈরি করা খুব শক্ত । থ্রেডস্যাফযুক্ত উপাদান বা ডিওএম-তে অ্যাক্সেস নেই। এবং আপনাকে সিরিয়ালযুক্ত বস্তুর মাধ্যমে কোনও থ্রেডের মধ্যে এবং বাইরে নির্দিষ্ট ডেটা পাস করতে হবে। সুতরাং আপনার কোডে সমস্যা তৈরি করতে আপনাকে সত্যিই কঠোর পরিশ্রম করতে হবে।
তত্ত্ব ছাড়াও, সর্বদা সম্ভাব্য কোণার কেস এবং গ্রহণযোগ্য উত্তরে বর্ণিত বাগগুলি সম্পর্কে প্রস্তুত থাকুন
জাভাস্ক্রিপ্ট / ECMAScript একটি হোস্ট পরিবেশের মধ্যে বাস করার জন্য ডিজাইন করা হয়েছে। এটি হ'ল, জাভাস্ক্রিপ্ট প্রকৃতপক্ষে কিছুই করবে না যতক্ষণ না হোস্ট পরিবেশ কোনও প্রদত্ত স্ক্রিপ্টকে বিশ্লেষণ এবং সম্পাদন করার সিদ্ধান্ত নেয় এবং পরিবেশগত সামগ্রী সরবরাহ করে যা জাভাস্ক্রিপ্টটি আসলে কার্যকর হতে দেয় (যেমন ব্রাউজারগুলিতে ডোম)।
আমি মনে করি একটি প্রদত্ত ফাংশন বা স্ক্রিপ্ট ব্লক লাইন বাই লাইন কার্যকর করবে এবং এটি জাভাস্ক্রিপ্টের জন্য গ্যারান্টিযুক্ত। তবে সম্ভবত একটি হোস্ট পরিবেশ একই সাথে একাধিক স্ক্রিপ্ট কার্যকর করতে পারে। অথবা, একটি হোস্ট পরিবেশ সর্বদা একটি বস্তু সরবরাহ করতে পারে যা মাল্টি-থ্রেডিং সরবরাহ করে। setTimeout
এবং setInterval
উদাহরণস্বরূপ, বা অন্তত সিউডো-উদাহরণ, একটি হোস্ট পরিবেশের কিছু সংক্ষিপ্তকরণ করার উপায় প্রদান করে (এমনকি এটি ঠিক একমত না হলেও)।
না।
আমি এখানে জনতার বিরুদ্ধে যাচ্ছি, তবে আমার সাথে সহ্য কর। একটি একক জেএস স্ক্রিপ্ট কার্যকরভাবে একক থ্রেডযুক্ত করার উদ্দেশ্যে করা হয়েছে , তবে এর অর্থ এই নয় যে এটি আলাদাভাবে ব্যাখ্যা করা যায় না।
ধরা যাক আপনার নিম্নলিখিত কোড রয়েছে ...
var list = [];
for (var i = 0; i < 10000; i++) {
list[i] = i * i;
}
এটি এই প্রত্যাশার সাথে লেখা হয়েছে যে লুপের শেষে, তালিকার অবশ্যই 10000 এন্ট্রি থাকতে হবে যা সূচক বর্গক্ষেত্র, তবে ভিএম লক্ষ্য করতে পারে যে লুপের প্রতিটি পুনরাবৃত্তি অন্যটির উপর প্রভাব ফেলে না এবং দুটি থ্রেড ব্যবহার করে পুনরায় ব্যাখ্যা করতে পারে।
প্রথম থ্রেড
for (var i = 0; i < 5000; i++) {
list[i] = i * i;
}
দ্বিতীয় থ্রেড
for (var i = 5000; i < 10000; i++) {
list[i] = i * i;
}
আমি এখানে সরলীকরণ করছি, কারণ জেএস অ্যারেগুলি আরও জটিল তবে মেমরির নীরব অংশগুলি, তবে যদি এই দুটি স্ক্রিপ্টগুলি থ্রেড-নিরাপদ উপায়ে অ্যারেতে এন্ট্রি যুক্ত করতে সক্ষম হয়, তবে উভয়ই সম্পাদন করার সময় এটির সাথে থাকতে হবে একক থ্রেডযুক্ত সংস্করণ হিসাবে একই ফলাফল।
যদিও আমি কোনও ভিএম এর সমান্তরাল কোড সনাক্ত করার বিষয়ে অবগত নই, তবে সম্ভবত এটি জেআইটি ভিএমদের জন্য ভবিষ্যতে অস্তিত্বের মধ্যে উপস্থিত হতে পারে বলে মনে হয়, কারণ এটি কিছু পরিস্থিতিতে আরও গতি সরবরাহ করতে পারে।
এই ধারণাটি আরও এগিয়ে নিয়ে যাওয়া, ভিএমএমকে মাল্টি-থ্রেড কোডে কী রূপান্তর করতে হবে তা জানাতে কোডটি এনটোট করা যেতে পারে।
// like "use strict" this enables certain features on compatible VMs.
"use parallel";
var list = [];
// This string, which has no effect on incompatible VMs, enables threading on
// this loop.
"parallel for";
for (var i = 0; i < 10000; i++) {
list[i] = i * i;
}
যেহেতু ওয়েব ওয়ার্কার্স জাভাস্ক্রিপ্টে আসছেন, এই ... কুরুচিপূর্ণ সিস্টেমটি কখনই অস্তিত্ব লাভের সম্ভাবনা কম, তবে আমি মনে করি জাভাস্ক্রিপ্ট traditionতিহ্যের দ্বারা একক থ্রেডযুক্ত বলা নিরাপদ।
ঠিক আছে, ক্রোম মাল্টিপ্রসেস এবং আমি মনে করি প্রতিটি প্রক্রিয়া তার নিজস্ব জাভাস্ক্রিপ্ট কোড নিয়ে কাজ করে, তবে কোডটি যতদূর জানা যায়, এটি "একক থ্রেডেড"।
মাল্টি-থ্রেডিংয়ের জন্য জাভাস্ক্রিপ্টে কোনও সমর্থন নেই, অন্তত স্পষ্টভাবে নয়, তাই এটি কোনও পার্থক্য করে না।
আমি @ বোবিন্সের উদাহরণটি কিছুটা পরিবর্তন করে চেষ্টা করেছি:
<html>
<head>
<title>Test</title>
</head>
<body>
<textarea id="log" rows="20" cols="40"></textarea>
<br />
<button id="act">Run</button>
<script type="text/javascript">
let l= document.getElementById('log');
let b = document.getElementById('act');
let s = 0;
b.addEventListener('click', function() {
l.value += 'click begin\n';
s = 10;
let s2 = s;
alert('alert!');
s = s + s2;
l.value += 'click end\n';
l.value += `result = ${s}, should be ${s2 + s2}\n`;
l.value += '----------\n';
});
window.addEventListener('resize', function() {
if (s === 10) {
s = 5;
}
l.value+= 'resize\n';
});
</script>
</body>
</html>
সুতরাং, যখন আপনি রান টিপুন, সতর্কতা পপআপটি বন্ধ করুন এবং একটি "একক থ্রেড" করুন, আপনার এমন কিছু দেখা উচিত:
click begin
click end
result = 20, should be 20
তবে আপনি যদি উইন্ডোতে অপেরা বা ফায়ারফক্স স্থিতিশীল এ চালানোর চেষ্টা করেন এবং স্ক্রিনে সতর্কতা পপআপ সহ উইন্ডোটি ন্যূনতম / ম্যাক্সিমাইজ করে রাখেন তবে এরকম কিছু হবে:
click begin
resize
click end
result = 15, should be 20
আমি বলতে চাই না যে এটি "মাল্টিথ্রেডিং", তবে কোডের কিছু অংশ আমার কাছে এটি প্রত্যাশা না করে একটি ভুল সময়ে কার্যকর করা হয়েছিল এবং এখন আমার একটি দুর্নীতিযুক্ত অবস্থা রয়েছে। এবং এই আচরণ সম্পর্কে জানতে আরও ভাল।
একে অপরের মধ্যে দুটি সেটটাইমআউট ফাংশন নেস্ট করার চেষ্টা করুন এবং তারা মাল্টিথ্রেডযুক্ত আচরণ করবে (যেমন; বহিরাগত টাইমার তার ফাংশনটি সম্পাদন করার আগে অভ্যন্তরীণটির সম্পূর্ণ হওয়ার জন্য অপেক্ষা করবে না)।
setTimeout(function(){setTimeout(function(){console.log('i herd you liek async')}, 0); alert('yo dawg!')}, 0)
(রেকর্ডের জন্য, আপনারা ডগ সবসময় আগে আসা উচিত, তারপরে কনসোল লগ আউটপুট)