【问题标题】:error while using the Q library nodeJS使用Q库nodeJS时出错
【发布时间】:2016-04-07 16:42:12
【问题描述】:

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

【问题讨论】:

  • 您创建了一个value 函数,但没有调用它。

标签: javascript node.js asynchronous promise q


【解决方案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() 成为一个更易于使用的承诺。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-28
    • 2017-06-26
    • 2015-09-26
    • 2015-05-15
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多