Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Nodejs, die nicht auf den Abschluss der Redis-Abfrage warten, bevor sie mit der Ausführung fortfahren

Sie sagen, dass Datei 2/3 "gleichen Inhalt" haben, aber sie befinden sich nicht in einem kritischen Bereich. Laut Bluebirds Dokumentation für promisifyAll (siehe http://bluebirdjs.com/docs/api/promise.promisifyall.html), erstellt diese Funktion einen ...Async Version jeder Kernfunktion im Redis-Client. Sie rufen hmgetAsync auf in Ihrem ersten Fall, aber Sie rufen nur hmget auf in deinen anderen.

Dies ist wichtig, da Sie ein asynchrones Muster verwenden, jedoch mit einer nicht asynchronen Codestruktur. In Datei2/3 setzen Sie result1 innerhalb eines asynchronen Rückrufs, aber geben Sie es dann unter jedem Aufruf zurück, bevor der Aufruf möglicherweise zurückgekehrt sein könnte.

Sie haben zwei Möglichkeiten:

1:Sie können file2/3/etc in ein vollständig traditionelles Muster konvertieren, indem Sie zusätzlich zum Redis-Client einen Rückruf übergeben:

module.exports = function(redisclient, callback){

Anstatt result1 zurückzugeben , würden Sie den Callback dann mit diesem Wert aufrufen:

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

2:Sie könnten file2/3/..N in Promise-basiert umwandeln, in diesem Fall brauchen Sie promisifyAll(require(...)) nicht sie - Sie können einfach require() Sie. Ein solches Muster könnte folgendermaßen aussehen:

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

Dies ist eine viel einfachere und sauberere Option, und wenn Sie damit weitermachen, können Sie sehen, dass Sie wahrscheinlich sogar require() eliminieren und einfach hmgetAsync ausführen könnten in file1 mit entsprechenden Daten, die von Cassandra zurückgegeben wurden. Aber es ist schwer zu wissen, ohne Ihre spezifischen Anwendungsanforderungen zu kennen. Auf jeden Fall sind Promise-basierte Muster im Allgemeinen viel kürzer und sauberer, aber nicht immer besser – es gibt einen moderaten Leistungsaufwand für ihre Verwendung. Es liegt an Ihnen, welchen Weg Sie gehen - beides wird funktionieren.