2016-09-18 9 views
6
function test(){ 
    setTimeout(function(){ 
    var now=new Date(); 
    while((new Date()).getTime() < now.getTime()+5000){ } 
    console.log('p') 
    }, 0); 
} 

test(); 
test(); //it takes 10 seconds,the second test function runs after the first finished. 

क्या कोई मुझे बता सकता है कि यह कैसे काम करता है?क्यों सेटटाइम कोड अवरुद्ध?

+0

जावास्क्रिप्ट "मल्टी-थ्रेडेड" नहीं है; धारावाहिक में निष्पादित कार्य, समानांतर नहीं। –

उत्तर

5

इसका कारण यह है क्या हो रहा है, जब भी आप setTimeout के अंदर एक function गुजरती हैं और यह कहते हैं, पारित कर दिया समारोह callBack कतार मिलीसेकेंड में आपूर्ति की देरी के आधार पर में धकेल दिया हो जाएगा। कॉलबैक कतार के अंदर के कार्यों को उनके द्वारा धक्का दिए गए क्रम में एक-एक करके निष्पादित किया जाएगा। तो यहां आपके मामले में, आप function के कोड प्रवाह को अवरुद्ध कर रहे हैं जो while लूप चलाकर callBack कतार के अंदर मौजूद है। इसलिए test की दूसरी कॉल निष्पादित करने में 10 सेकंड लग रही है।

test(); //call 1 
callBack queue ----> [function(){ while(){} }] 

test(); //call 2 
callBack queue ----> [function(){ while(){} }, function(){ while(){} }] 

नोट: वापस कतार कॉल इसके निष्पादन शुरू कर देंगे जब वहाँ कॉल स्टैक पर अमल करने में कुछ भी नहीं है।

इसके लिए सर्वश्रेष्ठ पढ़ें, Event Loop

+0

तो, 'while() {} 'में कोड एक ही समय में उत्साहित नहीं होगा? – lx1412

+0

@ lx1412 हाँ, कॉलबैक कतार में कार्य सामान्य सरणी के अंदर कार्यों के सामान्य निष्पादन के रूप में निष्पादित किए जाएंगे। एक एक करके। –

2

आप एक गैर अवरुद्ध कार्यान्वयन आप अतुल्यकालिक प्रत्यावर्तन के साथ अपने तुल्यकालिक while पाश को बदलने के लिए चाहते हैं:

function test(x){ 
 
    setTimeout(function loop(now) { 
 
    (new Date()).getTime() < now.getTime()+2000 
 
    ? setTimeout(loop, 0, now) 
 
    : console.log('p', x); 
 
    },0, new Date()) 
 
} 
 

 
test(1); 
 
test(2);

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