¿Rompiendo una promesa Q en Node.js al realizar una devolución de llamada?

Disculpe mi novedad con el concepto de promesas. Estoy usando el módulo Q en Node.js. Tengo una función que está destinada a llamar 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 desde la promesa Q.

Mi funcionalidad deseada es poder llamar a la devolución de llamada cuando llegue al paso final y ya no estar dentro de la cadena de promesas. Por lo tanto, la devolución de llamada volverá a su funcionamiento original. Sin embargo, como lo he codificado, la devolución de llamada se llama dentro del contexto de la promesa. En este punto, si la devolución de llamada (digamos) arroja un error, el controlador de errores lo detecta 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....

preguntado el 28 de julio de 12 a las 00:07

1 Respuestas

Hay un método nodeify que (opcionalmente) saldrá de una cadena de promesas y pasará a una continuación al estilo de 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);

}

Tenga en cuenta el "retorno" agregado al comienzo de la cadena y el "nodeify (devolución de llamada)" agregado al final.

Sus usuarios no deben ser más conscientes de que está utilizando Q en absoluto... a menos que dejen de llamar, en cuyo caso obtendrán una promesa en su lugar.

Respondido 07 Oct 13, 08:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.