2012-12-24 14 views
16

होने की गारंटी है ट्रिगर फ़ंक्शन तुल्यकालिक लगता है। यही है, सभी बाध्य फ़ंक्शंस अनुक्रम में निष्पादित किए जाते हैं, सिंक्रनाइज़ (चालित फ़ंक्शन कुछ असंकालिक रूप से कर सकता है, लेकिन यह सवाल नहीं है)।क्या jQuery ट्रिगर फ़ंक्शन सिंक्रोनस

क्या यह कस्टम और गैर-कस्टम (क्लिक, होवर, आदि) ईवेंट के लिए सच है? क्या कोई ऐसी घटनाएं हैं जहां जावास्क्रिप्ट की सिंगल थ्रेडेड गारंटी सही नहीं है?

यदि यह सत्य है, तो व्यवहार को प्रत्येक बाध्य फ़ंक्शन में टाइमआउट डालने के बिना असीमित रूप से निष्पादित करने के लिए बदला जा सकता है?

var ele = $('#blah'); 
// Example of the bound function doing something synchronously 
ele.bind('customEvent.sync', function() { 
    // Do something synchronously 
    window.foo = 'foo'; 
}); 

// Example of the bound function doing something asynchronously 
ele.bind('customEvent.async', function() { 
    window.setTimeout(function() { 
     // Do something asynchronously 
     window.bar = 'bar'; 
    }, 0); 
}); 

// Trigger both events 
ele.trigger('customEvent'); 

// If trigger is guaranteed to be synchronous this should alert 'foo:undefined' or possibly 'foo:bar' depending on whether the asych function was called first 
// If trigger is NOT synchronous 'undefined:undefined', 'foo:undefined', 'undefined:bar', or 'foo:bar' could be alerted 
alert(window.foo + ':' + window.bar); 

अद्यतन देखें:

यहां नमूने जो सवाल यह दर्शाता है Is JavaScript guaranteed to be single-threaded? कस्टम घटनाओं जावास्क्रिप्ट के एकल थ्रेड स्वभाव की वजह से तुल्यकालिक होने की गारंटी है। कुछ घटना प्रकारों में बनाया गया ब्राउज़र ब्राउज़र असंगतताओं के कारण तुल्यकालिक नहीं हो सकता है।

+0

अगर आप क्या अपनी चिंताओं – charlietfl

+0

मेरी चिंता का विषय है कि क्या मैं – Kyle

+0

गति प्रदान करने के सवाल होने के लिए लगता है बाध्य कार्यों मेरी ट्रिगर कहा जाता आह्वान के बाद लाइन से पहले निष्पादित करने के लिए पर भरोसा कर सकते हैं का उदाहरण दिया पालन करने के लिए एक बहुत आसान हो विरोधाभासी: "चालित फ़ंक्शन कुछ async कर सकता है .. लेकिन यह सवाल नहीं है" और "क्या व्यवहार प्रत्येक बाध्य फ़ंक्शन में टाइमआउट डालने के बिना एसिंक निष्पादित करने के साथ बदल सकता है" (हालांकि मैं * प्रश्न नहीं था?) –

उत्तर

16

एक अपने आप से ऊपर की पेशकश की टिप्पणियों के हल्के से संशोधित संकलन - चुकंदर-चुकंदर:

  • घटनाक्रम कोई अवधि है, एक हैंडलर प्रदान करना संलग्न है, वे धागा शुरू करने का कारण बनते हैं। इसलिए, एक घटना, अपने आप में, न तो तुल्यकालिक और न ही समकालिक हो सकती है। एक घटना जो उत्तेजित होती है वह हमेशा तुल्यकालिक हो जाती है लेकिन एक या अधिक असीमित प्रक्रियाओं को निकाल सकती है।

  • .trigger() पर कॉल हमेशा किसी भी एसिंक्रोनस प्रक्रियाओं के बावजूद सिंक्रोनस होता है जो ट्रिगर किए गए ईवेंट हैंडलर में शुरू किया जा सकता है। जब ट्रिगर किए गए हैंडलर लौटते हैं, तो निष्पादन कथन पर वापस आ जाता है .trigger (...)। यानी, .trigger() एक गौरवशाली समारोह कॉल है।

  • जावास्क्रिप्ट में, वर्तमान धागा बिल्कुल) setTimeout (के साथ जगह में डाल दिया कुछ भी शुरू होता है से पहले पूरा होने से चलाने के लिए, भले ही समय समाप्ति अवधि 0. ajax के साथ भी यही है गारंटी है - एक धागा है कि कहता है, कहते हैं, $.ajax(...) है किसी भी सफलता/त्रुटि/पूर्ण हैंडलर शुरू होने से पहले पूरा होने के लिए चलाने की गारंटी है, भले ही सर्वर तुरंत जवाब देना था।

  • सिंगल थ्रेडेनेस ईसीएमए -262 (जावास्क्रिप्ट), यानी निहित है। समय में किसी भी समय, अधिकतम एक धागा चल रहा है।

अतिरिक्त बिंदु:

Is javascript guaranteed to be single-threaded? को acceped जवाब एक झूठे आधार पर आधारित है। कोई साक्ष्य नहीं दिया जाता है कि जावास्क्रिप्ट एकल-थ्रेडेड नहीं है। @ क्रिसजीजिंग की टिप्पणी ने गलतफहमी को खारिज कर दिया।