Todo en nodejs no bloquea, lo cual es bueno, pero ¿cómo haré para hacer funciones que tengan que ser una tras otra sin tener una lista anidada de callbacks?Escribir código de "bloqueo" en nodejs
Respuesta
Usted no tiene que anidar sus devoluciones de llamada.
Hay muchos patrones en la escritura de código asíncrono.
Por ejemplo, esta anidada de estilo matrioska ...
database.find('foo', function (err, data) {
database.update('foo', 'bar', function (err, data) {
database.delete('bar', function (err, data) {
console.log(data);
});
});
});
... puede reescribirse en un limpiador (pero con más detalles) forma:
var onDelete = function (err, data) {
console.log(data);
},
onUpdate = function (err, data) {
database.delete('bar', onDelete);
},
onFind = function (err, data) {
database.update('foo', 'bar', onUpdate);
};
database.find('foo', onFind);
Otra opción es el uso de un módulo para abstraer la ejecución serial y paralela de devoluciones de llamadas.
El patrón con el que he tenido éxito utiliza una biblioteca de Promesa, como BlueBird: https: //github.com/petkaantonov/bluebird/blob/master/API.md#promisification y el patrón que uso (como dice masylum) es el sugerido en "Rookie Mistake 1" en el siguiente artículo: http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html –
Se trata de "una biblioteca de flujo de control simple para node.JS que hace que la ejecución en paralelo, la ejecución en serie y el manejo de errores sean sencillos".
-1 Esa no es una respuesta. Eso es solo un enlace. – Raynos
+1 ES una respuesta, aunque breve, aunque podría apuntar a toda la lista de bibliotecas de control de flujo https://github.com/joyent/node/wiki/modules#wiki-async-flow – talentedmrjones
@Chetan: un enlace está bien, pero no debería necesitar hacer clic en un enlace para saber a qué se refiere. Una descripción sucinta del enlace debe estar aquí –
Lo que realmente quiere hacer es averiguar por qué sus operaciones están bloqueando y recodificarlas para que no sean bloqueantes. Eliminar las dependencias entre sí. Necesita cambiar la forma en que está pensando en IO sin bloqueo.
Usar una biblioteca que le permita ejecutar este código de tipo de forma sincronizada es una muleta pobre.
Será mucho mejor aprender a escribir código no bloqueante en node.js porque eso es lo que está diseñado para hacer.
La async module es una solución particularmente buena, su uso da como resultado un código asíncrono mucho más limpio, con anidamiento mucho más superficial. Se puede conseguir a través de:
npm install async --save
Especialmente echar un vistazo a:
- async.series: esto le permite configurar una lista de funciones para ejecutar uno tras otro - en donde cada uno en el la lista se ejecuta solo después de la anterior a su finalización. Sin embargo, otro código (fuera de la serie definida) puede ejecutarse sin bloqueo.
- async.series: esto es similar a async.series, excepto que cada función en la lista pasa su resultado al siguiente en la lista, con el resultado final pasado a una devolución de llamada definida al final.
Sin embargo, todos async's control flow-specific methods son muy útiles para evitar grandes listas de devolución de llamada anidadas.
Además, si ayuda, here's a jsFiddle I put together al aprender la biblioteca, que contiene un conjunto de ejemplos, incluido uno para async.waterfall & otro para async.series (abra la consola para ver lo que está haciendo).
- 1. ¿Es posible escribir código para escribir código?
- 2. ¿Cómo puedo escribir una estructura sin bloqueo?
- 3. ¿Cómo escribir en un archivo usando IO sin bloqueo?
- 4. Cómo estructurar el código nodejs correctamente
- 5. Solicitud HTTPS en NodeJS
- 6. Leer y escribir en un archivo mientras mantiene el bloqueo
- 7. pthreads: bloqueos de lector/escritor, actualización del bloqueo de lectura para escribir el bloqueo
- 8. Escribir código MBR
- 9. Escribir código de cacao seguro
- 10. Escribir código de varios servidores
- 11. Escribir código en el documento de látex
- 12. Escribir información de copyright en código python
- 13. Nodejs en Nearlyfreespeech?
- 14. bloqueo en el interior de bloqueo
- 15. ¿Por qué no puedo escribir caracteres chinos en la respuesta HTTP de nodejs?
- 16. Requerir en nodejs
- 17. ¿Por qué el bloqueo de este código no funciona?
- 18. SSL Error en nodejs
- 19. Couchdb en Nodejs
- 20. cifrado en nodejs
- 21. Posible escribir el código Protovis en CoffeeScript?
- 22. ¿Puedo escribir código Java en XCode 3.2.1?
- 23. Cómo escribir eficientemente el código en papel
- 24. ¿Cómo emulo "dormir" en NodeJS?
- 25. ¿Podría escribir mejor este código?
- 26. ¿Cómo escribir código Java eficiente?
- 27. Cómo escribir código portable en C++?
- 28. bifurcan en NodeJS
- 29. bloqueo de archivos en php
- 30. nodejs - Nombre de archivo temporal
Node.js es para código sin bloqueo. Estás yendo en contra de la corriente y derrotando el propósito mismo al tratar de bloquearlo. –