我有以下nodeJS代码。我需要从redis数据库获取每个服务的机器。我正在使用'q'库来简化回调问题。但是我没有得到输出。
我是node / callbacks / q的新手。我在代码中的错误在哪里?
我有一个带有以下代码的controller.js文件
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函数)
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 :(得分: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()
作出承诺,使其更易于使用。