我使用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)
我运行这段代码,可以得到count1
和count2
的结果,但是console.log(countall)
显示undefined
,我不知道为什么,如何通过值到功能块之外?非常感谢
答案 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语句已经执行。