Redis
 sql >> Base de données >  >> NoSQL >> Redis

Nodejs, ne pas attendre la fin de la requête Redis avant de poursuivre l'exécution

Vous dites que file2/3 sont "même contenu" mais ils ne sont pas dans un domaine critique. Selon la documentation de Bluebird pour promisifyAll (voir http://bluebirdjs.com/docs/api/promise.promisifyall.html), cette fonctionnalité crée un ...Async version de chaque fonction principale dans le client Redis. Vous appelez hmgetAsync dans votre premier cas, mais vous n'appelez que hmget dans vos autres.

Ceci est important car vous utilisez un modèle asynchrone mais avec une structure de code non asynchrone. Dans file2/3 vous définissez result1 à l'intérieur d'un rappel asynchrone, mais renvoyez-le ensuite sous chaque appel avant que l'appel n'ait pu être renvoyé.

Vous avez deux choix :

1 :Vous pouvez convertir file2/3/etc en un modèle entièrement traditionnel en passant un rappel en plus du client redis :

module.exports = function(redisclient, callback){

Au lieu de retourner result1 , vous appelleriez alors le rappel avec cette valeur :

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

2 :Vous pouvez convertir file2/3/..N pour qu'il soit basé sur la promesse, auquel cas vous n'avez pas besoin de promisifyAll(require(...)) eux - vous pouvez simplement require() eux. Un tel modèle pourrait ressembler à :

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

C'est une option beaucoup plus simple et plus propre, et si vous continuez, vous pouvez voir que vous pouvez probablement même éliminer le require() et simplement faire le hmgetAsync dans file1 avec les données appropriées renvoyées par Cassandra. Mais il est difficile de savoir sans voir les besoins spécifiques de votre application. Dans tous les cas, les modèles basés sur Promise sont généralement beaucoup plus courts et plus propres, mais pas toujours meilleurs - il y a une surcharge de performances modérée pour les utiliser. C'est à vous de décider dans quelle direction vous allez - l'un ou l'autre fonctionnera.