Redis
 sql >> Database >  >> NoSQL >> Redis

Nodejs, non attende il completamento della query Redis prima di continuare con l'esecuzione

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.