Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Nodejs, não aguardando a conclusão da consulta Redis antes de continuar com a execução


Você diz que file2/3 são "mesmo conteúdo", mas não estão em uma área crítica. De acordo com a documentação do Bluebird para promisifyAll (consulte http://bluebirdjs.com/docs/api/promise.promisifyall.html), esse recurso cria um ...Async versão de cada função principal no cliente Redis. Você chama hmgetAsync no seu primeiro caso, mas você só chama hmget em seus outros.

Isso é importante porque você está usando um padrão assíncrono, mas com uma estrutura de código não assíncrona. Em file2/3 você define result1 dentro de um retorno de chamada assíncrono, mas, em seguida, retorne-o abaixo de cada chamada antes que a chamada possa ter retornado.

Você tem duas opções:

1:Você pode converter file2/3/etc para um padrão totalmente tradicional passando um callback além do cliente redis:
module.exports = function(redisclient, callback){

Em vez de retornar result1 , você chamaria o retorno de chamada com este valor:
if(redisValue == 'test value'){
    callback(null, "success");
} else {
    callback("failed", null);
}

2:Você pode converter file2/3/..N para ser baseado em Promise, nesse caso você não precisa promisifyAll(require(...)) eles - você pode simplesmente require() eles. Esse padrão pode se parecer com:
module.exports = function(redisclient){
    return redisclient.hmgetAsync("testdata", "text1");
};

Esta é uma opção muito mais simples e limpa, e se você continuar com ela, poderá ver que provavelmente poderia até eliminar o require() e simplesmente fazer o hmgetAsync no arquivo1 com os dados apropriados retornados pelo Cassandra. Mas é difícil saber sem ver suas necessidades específicas de aplicação. De qualquer forma, os padrões baseados em Promise são geralmente muito mais curtos e limpos, mas nem sempre melhores - há uma sobrecarga de desempenho moderada para usá-los. É sua escolha o caminho que você vai - qualquer um funcionará.