threads periodic nodejs node nexttick loop example avoid javascript node.js promise es6-promise

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.