2016-09-18 5 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. 

kann mir jemand erklären, wie es funktioniert?Warum setTimeout-Code blockiert?

+0

JavaScript ist nicht "multi-threaded"; Die Funktionen werden seriell und nicht parallel ausgeführt. –

Antwort

5

Dies passiert, weil, wenn Sie eine function innerhalb von setTimeout übergeben und es aufrufen, wird die übergebene Funktion in die callBack Warteschlange basierend auf der gelieferten Verzögerung in Millisekunden geschoben. Die Funktionen innerhalb der CallBack-Warteschlange werden nacheinander in der Reihenfolge ausgeführt, in der sie gedrängt wurden. In diesem Fall blockieren Sie den Codefluss function, der in der Warteschlange callBack vorhanden ist, indem Sie eine while-Schleife ausführen. Daher dauert der zweite Aufruf von test 10 Sekunden zur Ausführung.

Hinweis: Die Rückrufwarteschlange startet ihre Ausführung, wenn im Aufrufstapel nichts ausgeführt wird.

Am besten lesen Sie hierzu, Event Loop.

+0

Also wird der Code in der 'while() {}' nicht zur gleichen Zeit ausgeführt werden? – lx1412

+0

@ lx1412 Ja, die Funktionen in der CallBack-Warteschlange werden als normale Ausführung von Funktionen innerhalb eines normalen Arrays ausgeführt. Einer nach dem anderen. –

2

Wenn Sie eine nicht-blockierende Implementierung haben Sie Ihre synchrone while Schleife mit asynchroner Rekursion ersetzen:

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);

Verwandte Themen