JS

2016-01-04 11 views
0

我有以下nodeJS代碼。我需要從redis數據庫獲取每臺服務的機器。我正在使用'q'庫來簡化回調問題。但是我沒有得到輸出。JS

我剛接觸node/callbacks/q。代碼中的錯誤在哪裏?

我有以下代碼

function getMachines(services) { 
    var machines = Q.fcall(function() {}); 
    services.forEach(function(service) { 
    var value = function() { 
     var deferred = Q.defer(); 
     redisDB.readfromRedis(service, function(result) { 
     deferred.resolve(result); 
     }); 
     return deferred.promise; 
    } 
    }); 
    return machines; 
} 

testController.js(呼叫從controller.js的getMachines功能)的controller.js文件

var services = ['dashDb22', 'service1', 'service2', 'service3'] 
var output = controller.getMachines(services) 
console.log(output); 

RedisDb.js

function readfromRedis(key, callback) { 
    client.smembers(key, function(error, value) { 
    if (error) { 
     throw error; 
    } 
    console.log('VALUE IS: = ' + value); 
    callback(value); 
    }); 
} 
+0

您創建了一個'value'函數,但不調用它。 – zerkms

回答

1

你的getMachines()沒有太大的作用,machines是無用的,在您的forEach()中,您正在存儲一個永遠不會執行的功能。你的代碼很簡單,你並不需要使用Q,nodejs有一個原生的Promise支持。

function getMachines(services) { 
    // create an array of promises 
    var myPromises = services.map(function (service) { 
     // for each service, create a Promise 
     return new Promise(function (resolve, reject) { 
      redisDB.readfromRedis(service, function (result) { 
       resolve(result); 
      }); 
     }); 
    }) 
    // takes an array of promises and returns a promise for when they've all 
    // fulfilled (completed successfully) with the values as the result 
    return Promise.all(myPromises); 
} 

getMachines(services).then(function (machines) { 
    // use machines here 
}); 

你也可以將readfromRedis()承諾,使其更易於使用。