请考虑以下代码:
if(connections.hasOwnProperty(id)){
console.log('client '+id+' is connected. querying redis.');
id = id;
redisClientActor.lrange("NOTIFICATIONS_"+id, 0, 0, function(err, reply) {
if(reply !== null && reply !== undefined){
console.log(JSON.stringify(Object.keys(connections)));
connections[id].sendUTF(reply);
console.log('Forwarded notification to client '+id);
}else{
console.log(err);
}
});
}else{
console.log('Received notification, but client '+id+' not connected.')
}
它是用NodeJS编写的非常基本的通知服务器的一部分。它使用 redis npm包。 由于Node的异步特性,我理解为什么代码当前无法正常工作( id 超出范围,导致 sendUTF 失败,从而导致脚本崩溃)。
如果 lrange 是一个自定义函数,我只需在这里添加第三个参数并完成它。但是,由于我没有努力找到关于如何访问" id"在 lrange 回调(l5及以下)
内我非常感谢能够朝着正确的方向快速提示。
答案 0 :(得分:1)
如果您正在迭代改变“id”值的循环,则回调将全部看到在上一次迭代期间分配给它的“id”的最后一个值。
在这种情况下,您需要使用闭包来捕获id的值:
var produceClosureForId = function(id){
return function(err, reply) {
if(reply !== null && reply !== undefined){
console.log(JSON.stringify(Object.keys(connections)));
connections[id].sendUTF(reply);
console.log('Forwarded notification to client '+id);
}else{
console.log(err);
}
};
}
redisClientActor.lrange("NOTIFICATIONS_"+id, 0, 0, produceClosureForId(id) );