क्योंकि एक ब्राउज़र में जावास्क्रिप्ट एकल थ्रेडेड है (वेबवर्कर्स को छोड़कर जो यहां शामिल नहीं हैं) और जावास्क्रिप्ट निष्पादन का एक धागा दूसरे को चलाने से पहले पूरा करने के लिए चलता है, आपका बयान:
while(flag==false) {}
बस हमेशा के लिए चलेगा (या जब तक कि ब्राउज़र एक गैर-उत्तरदायी जावास्क्रिप्ट लूप के बारे में शिकायत नहीं करता है), पृष्ठ लटका हुआ दिखाई देगा और किसी अन्य जावास्क्रिप्ट को कभी भी चलाने का मौका नहीं मिलेगा, इस प्रकार ध्वज का मान कभी नहीं बदला जा सकता है।
थोड़ी और व्याख्या के लिए, जावास्क्रिप्ट एक घटना संचालित भाषा है । इसका मतलब है कि यह जावास्क्रिप्ट का एक टुकड़ा चलाता है जब तक कि यह इंटरप्रेटर पर वापस नियंत्रण नहीं करता है। फिर, केवल जब यह दुभाषिया पर वापस लौटता है, तो जावास्क्रिप्ट को घटना कतार से अगली घटना मिलती है और इसे चलाता है।
सभी चीजें जैसे टाइमर और नेटवर्क ईवेंट इवेंट क्यू के माध्यम से चलते हैं। इसलिए, जब एक टाइमर फायर होता है या नेटवर्क अनुरोध आता है, तो यह वर्तमान में चल रहे जावास्क्रिप्ट को "बाधित" नहीं करता है। इसके बजाय, एक घटना जावास्क्रिप्ट इवेंट कतार में डाल दी जाती है और फिर, जब वर्तमान में चल रही जावास्क्रिप्ट खत्म हो जाती है, तो अगली घटना को इवेंट कतार से खींच लिया जाता है और इसे चलाने की बारी आती है।
इसलिए, जब आप एक अनंत लूप करते हैं जैसे कि while(flag==false) {}
, वर्तमान में चल रहा जावास्क्रिप्ट कभी खत्म नहीं होता है और इस तरह अगली घटना कभी भी कतार से नहीं खींची जाती है और इस प्रकार flag
कभी भी मूल्य नहीं बदला जाता है। वे यहाँ कुंजी यह है कि जावास्क्रिप्ट संचालित बाधित नहीं है । जब टाइमर फायर करता है, तो यह वर्तमान में चल रहे जावास्क्रिप्ट को बाधित नहीं करता है, कुछ अन्य जावास्क्रिप्ट को चलाएं और फिर वर्तमान में चल रहे जावास्क्रिप्ट को जारी रखें। यह सिर्फ घटना कतार में खड़ा हो जाता है जब तक कि वर्तमान में चल रहे जावास्क्रिप्ट को चलाने के लिए अपनी बारी लाने के लिए इंतजार नहीं किया जाता है।
आपको क्या करने की आवश्यकता है, इस पर पुनर्विचार करें कि आपका कोड कैसे काम करता है और flag
मान बदलने पर जो भी कोड आप चलाना चाहते हैं उसे ट्रिगर करने का एक अलग तरीका खोजें । जावास्क्रिप्ट को एक इवेंट-संचालित भाषा के रूप में डिज़ाइन किया गया है। तो, आपको क्या करने की ज़रूरत है, यह पता लगाने के लिए कि आप किन घटनाओं में रुचि दर्ज कर सकते हैं ताकि आप या तो उस घटना को सुन सकें जो झंडा बदलने का कारण बन सकती है और आप उस घटना पर ध्वज की जांच कर सकते हैं या आप अपनी खुद की घटना को ट्रिगर कर सकते हैं जो भी कोड ध्वज को बदल सकता है या आप कॉलबैक फ़ंक्शन को कार्यान्वित कर सकते हैं जो भी कोड बदलता है वह ध्वज आपके कॉलबैक को कॉल कर सकता है जब भी ध्वज मूल्य को बदलने के लिए ज़िम्मेदार कोड का टुकड़ा इसे बदल देगा true
, तो यह कॉलबैक फ़ंक्शन को कॉल करता है और इस प्रकार आपका कोड जब ध्वज सेट हो जाता है तो चलना चाहता हैtrue
सही समय पर चलने के लिए मिलेगा। यह ध्वज मूल्य को लगातार जांचने के लिए किसी प्रकार के टाइमर का उपयोग करने की कोशिश करने की तुलना में बहुत अधिक कुशल है।
function codeThatMightChangeFlag(callback) {
if (condition happens to change flag value) {
callback();
}
}
jQuery.Deferred
,Q
,async
, ...