5

मेरे पास एक ऐसी स्थिति है जहां मैं कई (चार कहें) AJAX कॉल कर रहा हूं (AngularJS http का उपयोग करके, यदि यह मायने रखता है) और मैं चाहता हूं कि प्रत्येक कॉल कॉलबैक करे और काउंटर बढ़ाए, तो मुझे पता चलेगा कि सभी (चार) धागे पूरा हो गए हैं।ब्राउज़र में जावास्क्रिप्ट में एक समवर्ती पढ़ने/लिखने के पढ़ने/लिखने के लिए यह संभव है?

मेरी चिंता यह है कि चूंकि जावास्क्रिप्ट में जावा के "सिंक्रनाइज़" या "अस्थिर" कीवर्ड की तुलना में कुछ भी तुलनीय नहीं है, इसलिए काउंटर को बढ़ाने के दौरान एकाधिक समवर्ती धागे को टक्कर मारना संभव होगा, जिससे कुछ वृद्धि हुई है।

दूसरे शब्दों में, दो धागे एक ही समय में आते हैं, और दोनों काउंटर को पढ़ते हैं, वही मान प्राप्त करते हैं (उदाहरण के लिए 100)। फिर दोनों धागे उस काउंटर (101 तक) बढ़ाते हैं और नए मूल्य को स्टोर करते हैं, और देखते हैं, हम एक गिनती (102 के बजाय 101) चूक गए!

मुझे पता है कि जावास्क्रिप्ट को एकल थ्रेड माना जाना चाहिए, लेकिन अपवाद हैं।

क्या यह स्थिति ब्राउज़र में संभव है, और यदि हां, तो क्या इसके खिलाफ सुरक्षा करने का कोई तरीका है?

+3

वादे के कारण काउंटर की कोई आवश्यकता नहीं है। 'Q q.all()' पर एक नज़र डालें। '$ http' एक वादा देता है और आप वादे की एक सरणी लपेट सकते हैं और कॉल कर सकते हैं जब वे सभी – charlietfl

+0

पूरा करते हैं, यह मेरे साथ कभी नहीं हुआ है, AFAIR, लेकिन मैं एक उत्तर का इंतजार कर रहा हूं! अच्छा प्रश्न! – shaheer

+1

@mplungjan बहुत धीमा होगा – shaheer

उत्तर

4

नहीं, यह संभव नहीं है (कोई टकराव नहीं होगा)। प्रत्येक AJAX कॉल प्रतिक्रिया को जावास्क्रिप्ट संदेश कतार पर एक संदेश माना जा सकता है। जावास्क्रिप्ट रनटाइम कतार पर प्रत्येक संदेश को संसाधित करने से पहले पूरा करने से पहले संसाधित करता है। दूसरे शब्दों में, यह ईवेंट के लिए कॉलबैक को कॉल करता है और कतार में अगले संदेश पर जाने से पहले पूर्ण कॉलबैक फ़ंक्शन (और सभी फ़ंक्शंस कॉल करता है, और इसी तरह) पूरा करता है। इसलिए, कोई भी दो संदेश (उदा।, AJAX प्रतिक्रियाएं) समानांतर में संसाधित की जाएंगी।

स्रोत: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/EventLoop

इसके अलावा, मैं कई वर्षों के लिए जावास्क्रिप्ट में काम किया है और गारंटी ले सकते हैं यह है कि यह कैसे काम करता है।

+0

मैं आपको विश्वास करता हूं, लेकिन क्या आप कृपया कुछ प्रदान कर सकते हैं आपके दावे के लिए स्पष्टीकरण या स्रोत? –

+0

ग्रेट लिंक, धन्यवाद! –

3

जैसा आपने उल्लेख किया है, चूंकि जावास्क्रिप्ट एकल थ्रेडेड है, मुझे नहीं लगता कि ऐसा दृश्य होगा, जब आप वेबवर्कर्स का उपयोग करते हैं तो जेएस बहुगुणित हो जाता है, लेकिन यहां तक ​​कि वे समान चर साझा नहीं करते हैं (वे क्लोन करते हैं विशेषता js आप गुजरती हैं, मैं यहाँ यह सोचते हैं रहा हूँ) वस्तुओं, इसलिए पढ़ें/लिखें ओवरलैप के किसी भी मामले

संपादित

दूसरी सोचा पर

, वहाँ का कहना है कि वहाँ होना चाहिए समारोह onCounterIncreament जो एक गुच्छा करना होगा है जब आप इंक के तुरंत बाद इसे कॉल नहीं करते हैं तो काउंटर वृद्धि के दौरान ऑपरेशन का प्रतिद्वंद्वी काउंटर, लेकिन $watch या काउंटर में बदलाव की जांच करने के लिए कुछ टाइमआउट एफएन का उपयोग करें, एक अच्छी संभावना है कि आप एक बदलाव को याद कर सकते हैं।

+0

मेरी समझ है कि एकल थ्रेडेड चीज़ के अपवाद हैं ।उदाहरण के लिए, यदि कई AJAX कॉल एक ही समय में वापस आते हैं, या माउस इवेंट्स जैसी चीजें और ऐसे में, जहां –

+0

@VictorGrazi सुनिश्चित करने के लिए समेकन की आवश्यकता होती है, "जावास्क्रिप्ट असीमित हो सकता है, जो सच है। लेकिन वेबवर्क्सर्स के बिना मूल जावास्क्रिप्ट कभी भी बहुप्रचारित नहीं होता है देखें *** मैर Örlygsson का जवाब *** "- http://stackoverflow.com/questions/2734025/is-javascript-guaranteed-to-be-single-threaded – mido

संबंधित मुद्दे

 संबंधित मुद्दे