Казвате, че file2/3 са "едно и също съдържание", но не са в една критична област. Съгласно документацията на Bluebird за promisifyAll
(вижте http://bluebirdjs.com/docs/api/promise.promisifyall.html), тази функция създава ...Async
версия на всяка основна функция в клиента Redis. Извиквате hmgetAsync
в първия си случай, но извиквате само hmget
във вашите други.
Това е важно, защото използвате асинхронен модел, но с неасинхронна кодова структура. Във файл 2/3 задавате result1
вътре в асинхронно обратно извикване, но след това го върнете под всяко повикване, преди повикването да е възможно да се върне.
Имате два избора:
1:Можете да конвертирате file2/3/etc в напълно традиционен модел, като подадете обратно извикване в допълнение към клиента redis:
module.exports = function(redisclient, callback){
Вместо да връща result1
, тогава ще извикате обратното извикване с тази стойност:
if(redisValue == 'test value'){
callback(null, "success");
} else {
callback("failed", null);
}
2:Можете да конвертирате file2/3/..N да бъде базиран на Promise, в който случай не е необходимо да promisifyAll(require(...))
тях - можете просто require()
тях. Такъв модел може да изглежда така:
module.exports = function(redisclient){
return redisclient.hmgetAsync("testdata", "text1");
};
Това е много по-проста и по-чиста опция и ако продължите с нея, можете да видите, че вероятно бихте могли дори да премахнете require() и просто да направите hmgetAsync
във файл1 с подходящи данни, върнати от Касандра. Но е трудно да разберете, без да видите нуждите на вашето конкретно приложение. Във всеки случай моделите, базирани на Promise, обикновено са много по-кратки и по-чисти, но не винаги по-добри – има умерени разходи за производителност за използването им. От вас зависи кой път ще тръгнете - и двете ще работят.