sql >> Base de Datos >  >> NoSQL >> Redis

Nodejs, sin esperar a que se complete la consulta de Redis antes de continuar con la ejecución

Usted dice que los archivos 2/3 tienen "mismo contenido", pero no están en un área crítica. Según la documentación de Bluebird para promisifyAll (ver http://bluebirdjs.com/docs/api/promise.promisifyall.html), esta función crea un ...Async versión de cada función principal en el cliente de Redis. Llamas a hmgetAsync en tu primer caso, pero solo llamas a hmget en tus otros.

Esto es importante porque está utilizando un patrón asíncrono pero con una estructura de código no asíncrona. En el archivo 2/3 configuras result1 dentro de una devolución de llamada asíncrona, pero luego devuélvela debajo de cada llamada antes de que la llamada pudiera haber regresado.

Tienes dos opciones:

1:puede convertir file2/3/etc a un patrón totalmente tradicional pasando una devolución de llamada además del cliente redis:

module.exports = function(redisclient, callback){

En lugar de devolver result1 , entonces llamarías a la devolución de llamada con este valor:

if(redisValue == 'test value'){
    callback(null, "success");
} else {
    callback("failed", null);
}

2:Puede convertir el archivo 2/3/..N para que esté basado en Promise, en cuyo caso no necesita promisifyAll(require(...)) ellos - simplemente puede require() a ellos. Tal patrón podría verse así:

module.exports = function(redisclient){
    return redisclient.hmgetAsync("testdata", "text1");
};

Esta es una opción mucho más simple y limpia, y si continúa con ella, puede ver que probablemente incluso podría eliminar el require() y simplemente hacer hmgetAsync en el archivo 1 con los datos apropiados devueltos por Cassandra. Pero es difícil saberlo sin ver las necesidades específicas de su aplicación. En cualquier caso, los patrones basados ​​en Promise son generalmente mucho más breves y limpios, pero no siempre mejores:HAY una sobrecarga de rendimiento moderada para usarlos. Tú decides qué camino tomar; cualquiera de los dos funcionará.