2012-04-03 21 views
10

मान लीजिए मैं एक ईवेंट हैंडलर जो दो AJAX बनाता सर्वर से कॉल:क्या एजेक्स कॉलबैक लागू होने से पहले ईवेंट हैंडलर को पूरा करने की गारंटी है?

$("#foo").click(function(){ 
    $.get("bar", function(){ alert("Hello"); }); 
    $.get("baz", function(){ alert("World"); }); 
}); 

मैं, पता है कि जिस क्रम में कॉलबैक लागू कर रहे हैं गैर नियतात्मक है, क्योंकि यह कितनी देर तक प्रत्येक अनुरोध लेता है पर निर्भर करता है आदि

लेकिन यह मेरा प्रश्न है: क्या यह गारंटी है कि कॉलबैक फ़ंक्शंस का आह्वान करने से पहले मैं अपने ईवेंट हैंडलर के अंत तक पहुंच जाऊंगा? मैंने पढ़ा है कि किसी पृष्ठ के लिए सभी जावास्क्रिप्ट एक थ्रेड में निष्पादित होता है, इसलिए मुझे लगता है कि मेरा मानना ​​है कि मेरे click ईवेंट हैंडलर को कॉलबैक के किसी भी कॉल से पहले पूरा करने की गारंटी है।

क्या यह सही है? या यह संभव है कि पहला अनुरोध पूरा हो सकता है और हमारे कॉल हैंडलर के अंत तक पहुंचने से पहले पहला कॉलबैक निष्पादित किया जा सकता है?

उत्तर

10

संसाधित करने के लिए इंतजार कर के रूप में ही (एक तरह से) कतार में डाल दिया जाता है हाँ, यह गारंटी है और आप सही कर रहे हैं - सिर्फ एक धागा (नहीं है इस पल के लिए एस को अनदेखा कर रहा है)। जब जावास्क्रिप्ट कोड का एक टुकड़ा निष्पादित करता है (निष्पादन धागा पर कब्जा करता है) और एक AJAX कॉलबैक आता है (या कोई अन्य जीयूआई घटना, टाइमआउट, आदि) यह कतारबद्ध होता है और निष्पादन थ्रेड मुक्त होने तक प्रतीक्षा करता है (कोड समाप्त होने का वर्तमान भाग)।

जावास्क्रिप्ट इंजन आने वाली घटना को संभालने के लिए कभी भी चलने वाले कोड को बाधित नहीं करेगा - घटनाएं हमेशा कतार में प्रतीक्षा करेंगी। यही कारण है कि सीपीयू-गहन कोड निष्पादित होने पर जीयूआई ठंडा हो रहा है - कोई घटना नहीं संभाली जाती है। इसके अलावा सिंक्रोनस AJAX अनुरोध खराब हैं।

भी

4

हां, जावास्क्रिप्ट एकल धागा है, इसलिए आपका निष्पादन कभी भी पूर्ववत नहीं होगा।

असीमित कॉलबैक और ईवेंट समान तरीके से काम करते हैं; mousedown के लिए आपके हैंडलर को mouseup के लिए अपने हैंडलर से पहले समाप्त करने की गारंटी है, भले ही आपके mousedown हैंडलर को 2 सेकंड लगते हैं और आप तुरंत माउस को जाने देते हैं।

ही एक AJAX कॉलबैक के लिए चला जाता है, यह घटनाओं

0

मुझे लगता है कि जिस क्रम में कॉलबैक लागू कर रहे हैं गैर नियतात्मक है देखो, चूंकि यह प्रत्येक अनुरोध पर कितना समय लगता है, आदि

जिस तरह से आपने इसे लिखा है .. लेकिन इसे व्यवस्थित करने और नियंत्रित करने के तरीके हैं .. अर्थात् बदले और वादे।

यहाँ एक अच्छा सिंहावलोकन है: http://net.tutsplus.com/tutorials/javascript-ajax/wrangle-async-tasks-with-jquery-promises/

उन्हें का उचित उपयोग है कि आप जो समस्या आप से बचने की कोशिश कर रहे में नहीं चलेंगे सुनिश्चित करेगा।

** जैसा कि @ जुआन ने बताया है, यह आपके द्वारा पूछे गए प्रश्न के लिए काले और सफेद जवाब नहीं है। मैं आपको एक ही समस्या को देखने के लिए अलग-अलग दिशाओं या तरीकों से आपको इंगित करने की कोशिश कर रहा हूं ताकि आप अपने अपेक्षित व्यवहार को अधिक स्पष्ट रूप से परिभाषित कर सकें।

+1

ओपी –

+0

आदेश से बाहर आने वाले एसिंक कार्यों के बारे में नहीं पूछ रहा है, नहीं, लेकिन मैं कह रहा हूं कि क्या वह अपने सभी एसिंक कॉलबैक को नियंत्रित करता है, शायद वह उस समस्या का सामना नहीं करेगा जो वह इससे बचने की कोशिश कर रहा है पहले स्थान पर। ऐसा लगता है कि एक हैंडलर अन्य हैंडलर से पहले खत्म होता है। –

+0

"क्या यह सही है? या क्या यह संभव है कि पहला अनुरोध पूरा हो सकता है और हमारे कॉल हैंडलर के अंत तक पहुंचने से पहले पहला कॉलबैक निष्पादित किया जा सकता है?" यदि यह इस तरह से प्रोग्राम किया गया है जो इसे स्पष्ट करता है, तो उसके पास यह प्रश्न नहीं होगा, क्या वह? –

1

इसके लिए एक दिलचस्प मोड़ $ .get() के बजाय होगा, मान लें कि हम उन वादों का उपयोग कर रहे थे जिन्हें हम कहीं और से प्राप्त करते हैं (यानि वास्तविक एसिंक कॉल कहीं और बनाया गया था) (-हम ऐसी स्थिति क्यों रखेंगे ? शायद हो सकता है कि हमारे पास एक ज्ञात क्वेरी फ़ंक्शन हो।)

अब यदि कोई jQuery वादे का उपयोग कर रहा था, तो कॉलबैक को पहले ही हल किए जाने पर सिंक्रनाइज़ किया जाएगा। क्या यह कभी एक मुद्दा है? खैर आपकी आवश्यकता पर निर्भर करता है। यदि ऐसा होता है तो आप कॉलबैक कोड को सेटटाइमआउट (सीबी, 0) में लपेट सकते हैं।

दूसरी तरफ, क्या होगा यदि आप कॉलबैक को प्रीमेड करना चाहते थे? देखें my examples here

+0

@ जुआन मेंडेस, मुझ पर भी सवाल का जवाब देने का आरोप नहीं लगाया जा सकता है :-( –

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