[Javascript] NodeJS - setTimeout (fn, 0) vs setImmediate (fn)


Answers

Mit setImmediate () wird die sofortige Ausführung des Rückrufs nach E / A-Ereignisrückrufen und vor setTimeout und setInterval geplant.

setTimeout () soll die Ausführung eines einmaligen Rückrufs nach Verzögerungs-Millisekunden planen.

Das ist es, was die Dokumente sagen.

setTimeout(function() {
  console.log('setTimeout')
}, 0)

setImmediate(function() {
  console.log('setImmediate')
})

Wenn Sie den obigen Code ausführen, wird das Ergebnis folgendermaßen aussehen ... obwohl das aktuelle Dokument besagt, dass "die sofortige Ausführung des Rückrufs nach E / A-Ereigniskündigungen und vor setTimeout und setInterval geplant werden soll". ..

Ergebnis..

setTimeout

setImmediate

Wenn Sie Ihr Beispiel in einen anderen Timer einschließen, wird immer setImmediate gefolgt von setTimeout ausgegeben.

setTimeout(function() {
  setTimeout(function() {
    console.log('setTimeout')
  }, 0);
  setImmediate(function() {
    console.log('setImmediate')
  });
}, 10);
Question

Was ist der Unterschied zwischen diesen beiden, und wann werde ich eins über das andere verwenden?




Ein großartiger Artikel darüber, wie Event-Loop funktioniert und einige Missverständnisse klärt. http://voidcanvas.com/setimmediate-vs-nexttick-vs-settimeout/

Zitieren Sie den Artikel:

setImmediate Callbacks werden aufgerufen, nachdem E / A-Warteschlangenrückrufe beendet oder abgelaufen sind. setImmediate-Callbacks werden in Check Queue platziert, die nach der E / A-Warteschlange verarbeitet werden.

setTimeout(fn, 0) Callbacks werden in die Timer-Warteschlange gestellt und nach E / A-Rückrufen sowie Check Queue-Rückrufen aufgerufen. Bearbeiten Sie als Ereignisschleife die Timer-Warteschlange zuerst in jeder Iteration. Welche zuerst ausgeführt wird, hängt von der Phasen-Event-Schleife ab.