2011-04-21 21 views
8

Tengo una función gigante con muchas devoluciones de llamada anidadas. Quiero que sea más limpio y fácil de manejar. Por lo tanto, estoy pensando en usar detectores de eventos personalizadosCómo crear un detector de eventos personalizado en node.js (express.js)?

Al igual que, cuando se realiza una función, en la devolución de llamada, en lugar de poner un trozo de código, simplemente emite un evento, y luego se ejecutará el oyente.

Entonces, ¿cómo hacer eso en node.js? Todavía estoy buscando un buen ejemplo para guiarme.

+2

Relacionados http://stackoverflow.com/questions/4903154/how-do-i-avoid-deeply-nested-code-in-node-js? –

+0

Gracias. Intentaré. cual es el mejor? – murvinlai

+0

El primero está más relacionado con su problema. –

Respuesta

7

Probablemente desee crear un objeto EventEmitter, y llame al emit() en él.

19

se pueden establecer sucesos como éste

app.on('event:user_created', callback); 

A continuación, puede emitirlos

app.emit('event:user_created', data); 

express.js utiliza EventEmitter.

+1

Es en realidad que 'app' extiende' EventEmitter' en el marco ** connect ** que ** express ** extiende. [[email protected]] (https://github.com/senchalabs/connect/blob/master/lib/connect.js#L68) 'utils.merge (app, EventEmitter.prototype);' – antitoxic

+0

Así que el expreso ' app' puede actuar como un despacho de toda la aplicación –

+0

¿Esto tomará un objeto err - app.emit ('event: foo', err, data) - por ejemplo, si estamos devolviendo el resultado de una consulta a la base de datos? – starsinmypockets

3

Me acabo de enterar de esta pregunta, me gustaría aportar 2 céntimos, específicamente respondiendo a Luis.

En Expreso, si desea que la instancia 'app' para escuchar un evento personalizado que haría algo como:

app.on('testEvent', function() { 
    return console.log('responded to testEvent'); 
}); 

app.get('/test', function (req, res) { 
    app.emit('testEvent'); 
    return res.status(200).end(); 
}); 

Luego, cuando es golpeado por ese camino, que vería la respuesta en la consola . Por supuesto, puedes implementar esto como lo desees.

Cuestiones relacionadas