U zegt dat file2/3 "dezelfde inhoud" heeft, maar ze bevinden zich niet in één kritiek gebied. Volgens de documentatie van Bluebird voor promisifyAll
(zie http://bluebirdjs.com/docs/api/promise.promisifyall.html), deze functie creëert een ...Async
versie van elke kernfunctie in de Redis-client. Je belt hmgetAsync
in je eerste geval, maar je belt alleen hmget
in je anderen.
Dit is belangrijk omdat u een async-patroon gebruikt, maar met een niet-asynchrone codestructuur. In file2/3 stel je result1
. in binnen een asynchrone callback, maar retourneer deze dan onder elke oproep voordat de oproep mogelijk was teruggekomen.
Je hebt twee keuzes:
1:Je kunt file2/3/etc converteren naar een volledig traditioneel patroon door een callback door te geven naast de redis-client:
module.exports = function(redisclient, callback){
In plaats van result1
terug te sturen , zou u dan de callback aanroepen met deze waarde:
if(redisValue == 'test value'){
callback(null, "success");
} else {
callback("failed", null);
}
2:Je zou file2/3/..N kunnen converteren om op Promise-gebaseerd te zijn, in welk geval je niet hoeft te promisifyAll(require(...))
ze - je kunt gewoon require()
hen. Zo'n patroon kan er als volgt uitzien:
module.exports = function(redisclient){
return redisclient.hmgetAsync("testdata", "text1");
};
Dit is een veel eenvoudigere en schonere optie, en als je ermee doorgaat, kun je zien dat je waarschijnlijk zelfs de required() kunt elimineren en gewoon de hmgetAsync
kunt doen. in file1 met de juiste gegevens teruggestuurd door Cassandra. Maar het is moeilijk te weten zonder uw specifieke toepassingsbehoeften te zien. Hoe dan ook, op Promise gebaseerde patronen zijn over het algemeen veel korter en schoner, maar niet altijd beter - er IS een matige prestatie-overhead voor het gebruik ervan. Het is jouw keuze welke kant je op gaat - beide zullen werken.