Říkáte, že file2/3 jsou "stejný obsah", ale nejsou v jedné kritické oblasti. Podle dokumentace Bluebird pro promisifyAll
(viz http://bluebirdjs.com/docs/api/promise.promisifyall.html), tato funkce vytvoří ...Async
verze každé základní funkce v klientovi Redis. Voláte hmgetAsync
ve vašem prvním případě, ale voláte pouze hmget
ve vašich ostatních.
To je důležité, protože používáte asynchronní vzor, ale s neasynchronní strukturou kódu. V souboru 2/3 nastavíte result1
uvnitř asynchronního zpětného volání, ale poté jej vraťte pod každé volání dříve, než by se volání mohlo vrátit.
Máte dvě možnosti:
1:Soubor2/3/etc můžete převést na plně tradiční vzor předáním zpětného volání kromě klienta redis:
module.exports = function(redisclient, callback){
Místo vracení result1
, pak byste zavolali zpětné volání s touto hodnotou:
if(redisValue == 'test value'){
callback(null, "success");
} else {
callback("failed", null);
}
2:Soubor2/3/..N můžete převést na Promise-based, v takovém případě nemusíte promisifyAll(require(...))
- můžete jednoduše require()
jim. Takový vzor může vypadat takto:
module.exports = function(redisclient){
return redisclient.hmgetAsync("testdata", "text1");
};
Toto je mnohem jednodušší a čistší možnost, a pokud s ní budete pokračovat, uvidíte, že byste pravděpodobně mohli dokonce odstranit require() a jednoduše provést hmgetAsync
v souboru1 s příslušnými daty vrácenými Cassandrou. Ale je těžké to vědět, aniž byste viděli potřeby vaší konkrétní aplikace. V každém případě jsou vzory založené na Promise obecně mnohem kratší a čistší, ale ne vždy lepší – jejich použití JE s mírnou výkonností. Je na vás, jakým směrem se vydáte – obojí bude fungovat.