使用Q库nodeJS时出错

时间:2016-01-04 04:55:59

标签: javascript node.js asynchronous promise q

我有以下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);
  });
}

1 个答案:

答案 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()作出承诺,使其更易于使用。