2011-03-20 12 views
17

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

+2

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. –

Respuesta

12

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.

+1

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 –

8

UseStep.

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".

+0

-1 Esa no es una respuesta. Eso es solo un enlace. – Raynos

+5

+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

+3

@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í –

2

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.

1

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).