2016-05-26 4 views
0

Ich bin neu in Javascript, und vor kurzem habe ich die Verwendung von SetTimeout auf 0 millis kennen gelernt. Ich versuche es zu implementieren, aber ich bekomme nicht, was erwartet wird. Nach meinem Wissen muss es warten, bis alle Ereignisse beendet sind, aber es verhält sich nicht erwartungsgemäß. Bitte sagen Sie mir, was ich vermisse oder wo ich falsch liege.Warum wird das setTimeout 0 nicht am Ende der Funktion ausgeführt

index.html

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Test HTML</title> 

</head> 
<body> 

    <script src="js/index.js"></script> 
</body> 
</html> 

index.js

(function(){ 

    setTimeout(function() { 
     document.write("<p>Event 0 Processed !!</p>"); 
    },0); 

    setTimeout(function() { 
     document.write("<p>Event 1 Processed !!</p>"); 
    },1000); 

    setTimeout(function() { 
     document.write("<p>Event 2 Processed !!</p>"); 
    },2000); 

    setTimeout(function() { 
     document.write("<p>Event 3 Processed !!</p>"); 
    },3000); 

})(); 

Ausgang

Event 0 Processed !! 

Event 1 Processed !! 

Event 2 Processed !! 

Event 3 Processed !! 

ich so etwas wie

erwartet wurde
Event 1 Processed !! 

Event 2 Processed !! 

Event 3 Processed !! 

Event 0 Processed !! 

Danke :)

+8

Sie meinten, Sie erwarteten das Ergebnis des Aufrufs von setTimeout (..., 1000) vor setTimeout (..., 0)? – csharpfolk

+1

Mögliches Duplikat von [Asynchrone vs. synchrone Ausführung, was bedeutet das wirklich?] (Http://stackoverflow.com/questions/748175/asynchronous-vs-synchronous-execution-what-does-it-really-mean) – rottenoats

+1

* Alle * Ihrer 'setTimeout'-Aufrufe sind asynchron. Sie werden alle zur "Warteschlange" hinzugefügt und ausgeführt, sobald die aktuelle Funktion beendet ist (und die Zeit abgelaufen ist). 0ms sollte vor 1000ms passieren. –

Antwort

6

setTimeout mit einer Verzögerung von 0 wartet auf die aktuellen Aufrufstack zu löschen, nicht die Ereigniswarteschlange. Die anderen Timeouts fügen alle einen Rückruf ein, sodass sie nicht Teil des Aufrufstapels sind.

Wenn Sie sofort eine Protokollierungsfunktion aufrufen würden, würde das 0-Zeitlimit darauf warten, dass das abgeschlossen wird, aber keine anderen Zeitüberschreitungen. Zum Beispiel:

function log(n) { 
 
    console.log("Event", n, "processed!"); 
 
} 
 

 
setTimeout(log.bind(null, 0), 500); // wait 0.5 seconds 
 
setTimeout(log.bind(null, 1), 0); // wait until the stack clears 
 
log(2); // run now

Als MDN explains it:

obwohl SetTimeout mit einer Verzögerung von Null genannt wurde, es in einer Warteschlange gesetzt wird und bei der nächsten Gelegenheit Ausführung geplant, nicht sofort. Der aktuell ausgeführte Code muss ausgeführt werden, bevor Funktionen in der Warteschlange ausgeführt werden. Die resultierende Ausführungsreihenfolge ist möglicherweise nicht wie erwartet.

Als Jeremy Starcher in ihrer gelöschten Antwort erwähnt, eine Verzögerung von 0 ist ein weiches 0ms. Es wird den Rückruf an den Anfang der Warteschlange stellen, bietet jedoch keine Garantie, dass es tatsächlich sofort ausgeführt wird. Der aktuelle Kontext muss beendet werden, was sofort oder nie vorkommen kann. Darüber hinaus überprüfen Browser die Warteschlange nur gelegentlich auf ausstehende Callbacks, sodass die Implementierung möglicherweise eine zusätzliche Verzögerung verursacht.

0

Nun, diese Anweisungen werden von 0 bis 3000 ms ausgeführt.

Wie pro meines Wissens hat es zu warten, bis alle Ereignisse fertig ..

Nein, sollten sie so lange warten, wie Sie angegeben (0, 1000, 2000 oder 3000 ms)

-1

Wenn Sie dies:

setTimeout(function() { 
    document.write("<p>Event 0 Processed !!</p>"); 
},0); 

Ist in der Nähe sagen:

document.write("<p>Event 0 Processed !!</p>"); 

Weil es 0 ms wartet, bevor er ausgeführt wird, so sofort.

Wenn Sie möchten, dass die Reihenfolge die entgegengesetzte Richtung ist, muss die Verzögerung auf Ereignis 0 am längsten sein.

+2

Waiting 0ms und sofortige Ausführung sind nicht dasselbe. Die Dokumentation für 'setTimeout' ist sehr klar, dass es einen Callback in die Warteschlange einreihen wird, der ausgeführt wird, wenn der aktuelle Kontext beendet ist, der irgendwo von Sofort zu Niemals sein kann. – ssube

+0

@ssube Ja, ich bin mir bewusst, dass sie nicht dasselbe sind. Aber was das OP betrifft, so scheint es, als würde er gerade lernen, eine Erklärung, die gut genug ist. Du beginnst nicht im CS-Unterricht, um die Details zu lernen, du nimmst einen Schritt nach dem anderen. –

Verwandte Themen