2012-07-27 13 views
6

Disculpe mi novedad con el concepto de promesas. Estoy usando el módulo Q en Node.js. Tengo una función que debe llamar a una devolución de llamada una vez que haya realizado todos los pasos necesarios. El problema ocurre cuando quiero llamar a la función de devolución de llamada dentro de la promesa Q.¿Salir de una promesa de Q en Node.js al realizar una devolución de llamada?

Mi funcionalidad deseada es poder llamar a la devolución de llamada cuando llegue al último paso, y ya no esté dentro de la cadena de promesas. Por lo tanto, la devolución de llamada volverá a su operación original. Sin embargo, como lo he codificado, se llama a la devolución de llamada dentro del contexto de la promesa. En este punto, si la devolución de llamada (por ejemplo) arroja un error, queda atrapado por el controlador de errores en esta función, que no es lo que quiero.

var updateDataStream = function(data, input, posts, stream, callback) { 

    // Pack all the items up... 
    Q.ncall(data._packStream, data, posts, stream) 
    // Upsert the cache into the database 
    .then(function(){ 
     return Q.ncall(data.upsert, data); 
    }) 
    // buffer the new input 
    .then(function(res){ 
     return Q.ncall(data.buffer, data, input); 
    }) 
    .then(function(final){ 
     callback(null, final); 
    }) 
    .fail(function(err){ 
     console.log('OHNOES!!!!!!!',err); 
    }).end(); 
} 

En este contexto, un error que ocurre dentro de la función de devolución de llamada provoca "¡OHNOES !!!!!" para imprimir ....

Respuesta

4

Hay un método, nodeify que (opcionalmente) saldrá de una cadena de promesa y se reenviará a una continuación de estilo NodeJS.

var updateDataStream = function(data, input, posts, stream, callback) { 

    // Pack all the items up... 
    return Q.ncall(data._packStream, data, posts, stream) 
    // Upsert the cache into the database 
    .then(function(){ 
     return Q.ncall(data.upsert, data); 
    }) 
    // buffer the new input 
    .then(function(res){ 
     return Q.ncall(data.buffer, data, input); 
    }) 
    .nodeify(callback); 

} 

Nota el añadido de "retorno" al principio de la cadena y el "nodeify (devolución de llamada)" añadido al final.

No es necesario que sus usuarios sepan que está utilizando Q en absoluto ... a menos que dejen la devolución de llamada, en cuyo caso obtendrán una promesa.

Cuestiones relacionadas