gpt4 book ai didi

node.js - node_redis : using client. forEach 内多

转载 作者:IT王子 更新时间:2023-10-29 06:12:14 27 4
gpt4 key购买 nike

我有以下代码应该检索设备列表并获取每个设备的状态和标签:

app.get('/test', function(req, res){
db.smembers("devices", function(err1, devices){
var jsonObj = {};
if(!err1) {
var i = 0;
devices.forEach(function(id){
db.multi([
["get", id + ":label"],
["get", id + ":status"],
]).exec(function (err, replies) {
jsonObj[id] = {"label":replies[0], "status":replies[1]};
console.log(jsonObj); // stuff is added on each loop
});

i = i + 1;
if(i == devices.length){
console.log(jsonObj); // jsonObj is {}
h.respond(res, jsonObj);
}
});
} else {
h.respond(res, { "error" : err1 });
}
});
});

devices 是一个 ID 列表。对于每个 id,有 2 个键:"ID:status"、"ID:label"

h.respond 是一个发送 http 响应的辅助方法。

我可以在每个循环中看到新数据被添加到 jsonObj 中,但是当所有循环完成后,它是空的。

最佳答案

代码异步运行,并且在任何 Redis 调用实际完成之前计数到 devices.length(它不会等待来自 multi 的回调在继续之前返回)。将您的支票转移到回调中将防止这种情况发生。

app.get('/test', function(req, res){
db.smembers("devices", function(err1, devices){
var jsonObj = {};
if(!err1) {
var i = 0;
devices.forEach(function(id){
db.multi([
["get", id + ":label"],
["get", id + ":status"],
]).exec(function (err, replies) {
jsonObj[id] = {"label":replies[0], "status":replies[1]};
console.log(jsonObj); // stuff is added on each loop
i = i + 1;
if(i == devices.length){
console.log(jsonObj); // jsonObj is {}
h.respond(res, jsonObj);
}
});


});
} else {
h.respond(res, { "error" : err1 });
}
});
});

将这段代码移到一个单独的函数中可能更有意义,但希望您明白了。像 async 这样的异步库提供了辅助方法,可以更轻松地执行类似这样的并行异步循环。

关于node.js - node_redis : using client. forEach 内多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10374406/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com