javascript - periodic - node js timer loop
Promise.resolve(). Luego vs setImmediate vs nextTick (3)
Promise.resolve se resolvería de inmediato (sincrónicamente), mientras que setImmediate explícitamente inmediatamente después de la ejecución del evento actual.
NodeJS 0.11, así como io.js y la rama Node 0.12 se envían con promesas nativas.
Las promesas nativas tienen un método .then
que siempre se ejecuta en un ciclo de bucle de evento futuro.
Hasta ahora he estado usando setImmediate
para hacer colas en la próxima iteración del bucle de eventos desde que cambié de nextTick :
setImmediate(deferThisToNextTick); // My NodeJS 0.10 code
process.nextTick(deferThisToNextTick); // My NodeJS 0.8 code
Ya que ahora tenemos una nueva forma de hacer esto:
Promise.resolve().then(deferThisToNextTick);
¿Qué debo usar? Además, ¿ Promise.resolve.then
actúa como setImmediate
o como nextTick
con respecto al código que se ejecuta antes o después del bucle de eventos?
Usar Promise.resolve().then
tiene ventajas sobre nextTick
. Se ejecuta en la misma cola, pero tiene una prioridad ligeramente más alta, es decir, el controlador de promesas puede evitar que la próxima devolución de llamada de marcación se ejecute, lo contrario no es posible. Este comportamiento es un detalle de implementación y no se debe confiar en él.
Promise.resolve().then
es obviamente más lento (mucho, creo), porque crea dos promesas que serán desechadas.
Puede encontrar información extensa sobre la implementación aquí: https://github.com/joyent/node/pull/8325
La parte más importante: Promise.resolve().then
es como nextTick
y no como setImmediate
. Al setImmediate
lugar de setImmediate
puede cambiar drásticamente el comportamiento de su código.
No voy a responder la parte en negrita sobre tecnicismos, sino solo la pregunta.
¿Qué debo usar?
No creo que haya ninguna razón para usar Promise.resolve().then()
menos que esté interesado en la promesa del resultado de su función ejecutada de forma asíncrona. Por supuesto, si es así , entonces esto sería muy superior a lidiar con el infierno de devolución de llamada o hacer una new Promise
desde setTimeout
o nextTick
.
También hay una segunda diferencia técnica, más importante que el momento: las promesas hacen excepciones. Que probablemente no quieres. Entonces, como mencionó @vkurchatkin, no hagas promesas solo para deshacerte de ellas. No solo porque es más lento, sino porque hace que su código sea menos legible y su aplicación sea más propensa a errores.