Mówisz, że plik 2/3 to "taka sama zawartość", ale nie znajdują się w jednym krytycznym obszarze. Zgodnie z dokumentacją Bluebird dla promisifyAll
(patrz http://bluebirdjs.com/docs/api/promise.promisifyall.html), ta funkcja tworzy ...Async
wersja każdej podstawowej funkcji w kliencie Redis. Dzwonisz do hmgetAsync
w pierwszym przypadku, ale dzwonisz tylko do hmget
w innych.
Jest to ważne, ponieważ używasz wzorca asynchronicznego, ale ze strukturą kodu nieasynchroniczną. W pliku 2/3 ustawiasz result1
wewnątrz asynchronicznego wywołania zwrotnego, ale następnie zwracaj je pod każdym wywołaniem, zanim wywołanie mogłoby powrócić.
Masz dwie możliwości:
1:Możesz przekonwertować plik2/3/etc na w pełni tradycyjny wzorzec, przekazując wywołanie zwrotne oprócz klienta redis:
module.exports = function(redisclient, callback){
Zamiast zwracać result1
, wtedy wywołasz wywołanie zwrotne z następującą wartością:
if(redisValue == 'test value'){
callback(null, "success");
} else {
callback("failed", null);
}
2:Możesz przekonwertować plik2/3/..N, aby był oparty na Promise, w takim przypadku nie musisz promisifyAll(require(...))
je - możesz po prostu require()
ich. Taki wzór może wyglądać tak:
module.exports = function(redisclient){
return redisclient.hmgetAsync("testdata", "text1");
};
Jest to znacznie prostsza i czystsza opcja, a jeśli będziesz ją kontynuować, zobaczysz, że prawdopodobnie możesz nawet wyeliminować wymaganie() i po prostu wykonać hmgetAsync
w pliku 1 z odpowiednimi danymi zwróconymi przez Cassandrę. Ale trudno to stwierdzić, nie widząc konkretnych potrzeb aplikacji. W każdym razie wzorce oparte na obietnicy są na ogół znacznie krótsze i czystsze, ale nie zawsze lepsze – ich używanie JEST umiarkowane. To Twoja decyzja, w którą stronę idziesz — albo zadziała.