Dici che file2/3 sono "stesso contenuto" ma non si trovano in un'area critica. Secondo la documentazione di Bluebird per promisifyAll
(vedi http://bluebirdjs.com/docs/api/promise.promisifyall.html), questa funzione crea un ...Async
versione di ciascuna funzione principale nel client Redis. Chiama hmgetAsync
nel tuo primo caso, ma chiami solo hmget
negli altri.
Questo è importante perché stai usando un modello asincrono ma con una struttura di codice non asincrona. In file2/3 imposti result1
all'interno di una richiamata asincrona, ma poi restituiscila sotto ogni chiamata prima che la chiamata potesse essere restituita.
Hai due scelte:
1:puoi convertire file2/3/etc in un modello completamente tradizionale passando un callback oltre al client redis:
module.exports = function(redisclient, callback){
Invece di restituire result1
, chiamerai quindi la richiamata con questo valore:
if(redisValue == 'test value'){
callback(null, "success");
} else {
callback("failed", null);
}
2:Puoi convertire file2/3/..N in modo che sia basato su Promise, nel qual caso non è necessario promisifyAll(require(...))
loro - puoi semplicemente require()
loro. Un tale schema potrebbe assomigliare a:
module.exports = function(redisclient){
return redisclient.hmgetAsync("testdata", "text1");
};
Questa è un'opzione molto più semplice e pulita, e se continui con essa puoi vedere che probabilmente potresti anche eliminare require() ed eseguire semplicemente hmgetAsync
in file1 con i dati appropriati restituiti da Cassandra. Ma è difficile saperlo senza vedere le esigenze specifiche dell'applicazione. In ogni caso, i modelli basati su Promise sono generalmente molto più brevi e più puliti, ma non sempre migliori:C'è un sovraccarico di prestazioni moderato per il loro utilizzo. Sta a te decidere da che parte andare:entrambi funzioneranno.