如何在node.js中将hgetall中的值传递出去

时间:2018-07-27 06:30:24

标签: node.js redis node-redis

我使用redis,这是我的代码

const redis = require("redis"), client = redis.createClient()
let count1, count2, countall
client.hgetall('onekey', function(err, object) {
  if (object) {
    count1 = object.onevalue
    console.log(count1)
  } else {
    count1 = 2
  }
  client.quit()
})
client.hgetall('twokey', function(err, object) {
  if (object) {
    count2 = object.twovalue
    console.log(count2)
  } else {
    count2 = 3
  }
  client.quit()
})
countall = count1 + count2
console.log(countall)

我运行这段代码,可以得到count1count2的结果,但是console.log(countall)显示undefined,我不知道为什么,如何通过值到功能块之外?非常感谢

2 个答案:

答案 0 :(得分:0)

您可以使用多种方法,Promises,async / await,async模块。

阅读它们。对于您的代码,您可以像这样使用。

我为您提供了解决方案,但为了优化检查Promises,async / await,async模块。

const redis = require("redis"), client = redis.createClient()
let count1, count2, countall
client.hgetall('onekey', function(err, object) {
  if (object) {
    count1 = object.onevalue
    console.log(count1)
  } else {
    count1 = 2
  }
  client.quit()
  client.hgetall('twokey', function(err, object) {
    if (object) {
      count2 = object.twovalue
      console.log(count2)
    } else {
      count2 = 3
    }
    countall = count1 + count2
    console.log(countall)
    client.quit()
  })
})

让我解释一下为什么不起作用。

这两个客户端调用都是异步调用,它们将在主线程之外执行,而其他代码将在不等待它们的情况下执行。

答案 1 :(得分:0)

const redis = require("redis"), async = require("async"),client = redis.createClient()
let count1, count2, countall


async.parallel([
    function(callback) {
        client.hgetall('key1', function(err, object) {
      if (object) {
        if(object.count1){
            count1 = Number(object.count1)
        }else{
            count1 = 2 //which is default value you can set if value not found
        }
        callback(null,count1)
      } else {
        callback(err)
      }

    });

    },
    function(callback) {
        client.hgetall('key2', function(err, object) {
      if (object) {
        if(object.count2){
            count2 = Number(object.count2)
        }else{
            count2 = 2 //which is default value you can set if value not found
        }
        callback(null,count2)
      } else {
        callback(err)
      }

    });
    }
],
// optional callback
function(err, results) {
    console.log(results)
        countall = count1 + count2
    console.log("---------------",countall)
});

Node js以异步方式工作。因此,当redis忙于获取数据时,countall = count1 + count2语句已经执行。