2016-02-09 8 views
5

इस उदाहरण पर एक नज़र डालें:जावास्क्रिप्ट घटना एक साधारण फीफो कतार है या नहीं?

function A() { console.log('A'); } 
function B() { console.log('B'); } 
// and then i setTimeout(fn, 0) both of them 
setTimeout(A, 0); 
setTimeout(B, 0); 

यह guarantied कि B तुरंत A बाद चलने लगेंगे है?
क्या यह संभव है कि ब्राउज़र A और B के बीच कतार में एक और कार्य जोड़ें?

नोट: A या B फ़ंक्शंस में से कोई भी ईवेंट लूप में कोई नया कार्य नहीं जोड़ रहा है।

var callbacks = []; 
// then add a bunch of callbacks ... (none adds events to event queue) 
//case 1: 
callbacks.forEach(cb => setTimeout(cb,0)) 
//case 2: 
setTimeout(function() { 
    callbacks.forEach(cb => cb()); 
},0); 

वहाँ case 1 बनाम case 2 में कॉलबैक के निष्पादन के क्रम में कोई अंतर है?

+0

सरल जवाब: नहीं, कोई गारंटी नहीं है। चूंकि यह कतार जेएस इंजन के अलावा कई चीजों द्वारा उपयोग की जाती है। –

+0

क्या यह समवर्ती रूप से उपयोग किया जाता है? और क्या यह संभव है कि 'डीओएम' से एक घटना कतार में हो, जबकि जेएस का एक हिस्सा चल रहा है? (जेएस सिंगल थ्रेड नहीं है? और लंबे समय तक चलने वाली जेएस स्क्रिप्ट्स फ्रीज ब्राउज़र बंद कर देती हैं?) –

उत्तर

3

यह guarantied कि बी तुरंत एक के बाद चलेंगे है:

enter image description here

इसके अलावा यह लेख देखें?

नहीं तुरंत, नहीं, लेकिन यह है कि BA बाद चलने लगेंगे गारंटी है। पूर्ण विवरण in the spec, लेकिन संक्षेप में, यह विशेष रूप से timer initialization steps में संबोधित किया जाता है जो भाग में कहते हैं:

प्रतीक्षा जब तक इस एल्गोरिथ्म है कि एक ही विधि का संदर्भ था, कि जिसका समय समाप्ति है यह एक से पहले शुरू कर दिया है, और के किसी भी आमंत्रण इस के बराबर या उससे कम, पूरा हो गया है।

वैकल्पिक रूप से, एक और उपयोगकर्ता-एजेंट परिभाषित समय की प्रतीक्षा करें।

कतार कार्य कार्य

... जहां कार्य कॉलबैक आप setTimeout दिया बुला का कार्य है।

कार्य कतार क्रम में चलाने की आवश्यकता है, और इसलिए A एक अनुपालन ब्राउज़र पर B से पहले चलाएगा।

ध्यान दें कि यह क्योंकि वे एक ही विधि संदर्भ द्वारा पंक्तिबद्ध कर रहे थे की गारंटी है (क्या है कि साधन के विवरण के लिए कल्पना देखें)।

क्या यह संभव है कि ब्राउज़र ए और बी के बीच कतार में एक और कार्य जोड़ता है?

हां। ब्राउज़र A और B के कार्यों को कतारबद्ध करने के बीच में कुछ अन्य चीज़ों (वेब ​​कार्यकर्ता, आदि से एक संदेश) के लिए बहु-थ्रेडेड और कतार का कार्य हो सकता है। उस स्थिति में, आप A रन देखेंगे, फिर अन्य कार्य के लिए आपका हैंडलर (वेब ​​कार्यकर्ता या जो भी संदेश से संदेश संसाधित करेगा), फिर B देखें।

1

वे हमेशा सही क्रम में सक्रिय कर देगा, A तो B। हालांकि, वे लगातार आग नहीं कर सकते हैं।

वास्तव में, the specification says कि कॉलबैक का समय-समाप्त भी निष्पादन कतार पर रखा नहीं कर रहे हैं जब तक टाइमर बीत जाने पर, जो अतिरिक्त देरी के अधीन हो सकता - टाइमआउट आपके द्वारा निर्दिष्ट केवल एक न्यूनतम समय तक इंतजार करना की राशि है।

+0

क्या यह संभव है कि एक और कार्य 'ए' और 'बी' के बीच 'सी' चलाए? –

+0

'वे लगातार आग नहीं कर सकते हैं' ... लेकिन टाइमआउट शून्य है ... –

+0

हाँ, यह संभव है। जबकि संभावना नहीं है, इंजन स्वयं बहुप्रचारित है और कतार में जोड़ा गया 'ए' और कतार में जोड़ा जाने वाला 'बी' के बीच कतार में एक और घटना प्राप्त कर सकता है। –

-1

हां, अगर यो इस प्रयास करें:

function A() { console.log('A'); } 
function B() { console.log('B'); } 
function C() { while(1) { console.log('C'); } } 
// and then i setTimeout(fn, 0) both of them 
setTimeout(A, 0); 
setTimeout(C, 0); 
setTimeout(B, 0); 

आप समारोह सी अनंत लूप है कि देखेंगे, तो यह बी इसका कारण यह है कार्यों कार्य करने के लिए पारित किया है कभी नहीं समारोह निष्पादित किया जाता है है/घटना सूची और इन अंत के रूप में चलाते हैं। यह घटना सूची के संबंध में है सेटटाइमआउट में काम करने का एक विशेष तरीका है। लेकिन, यदि आप पूछ रहे हैं।

दूसरी ओर यदि आप पूछते हैं कि उस मामले को पहले कभी निष्पादित किया जाना है, तो बी के बाद, उत्तर की कोई गारंटी नहीं है क्योंकि वे एकमात्र ऐसी घटना नहीं हैं जो चल रहे हैं।

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