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.