Javascript NodeJS将变量传递给已定义的回调函数
考虑以下代码:Javascript NodeJS将变量传递给已定义的回调函数,javascript,node.js,Javascript,Node.js,考虑以下代码: 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 &
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是一个自定义函数,我只需在这里添加第三个参数,就可以使用它了。但既然不是这样,我就很难找到如何在lrange回调(l5及以下)中访问“id”的解决方案
非常感谢您给我一个正确方向的提示。如果您正在迭代一个改变“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) );
实际上id不在范围之外,它应该在那里。您是否在循环中使用此代码段,循环遍历分配给变量“id”的一系列值?在循环结束时,id的值将固定为迭代的最后一个值。然后,每个回调都会看到id的最后一个值。id来自哪里?检查(connections.hasOwnProperty(id)){…}是否应该发生在对lrange的回调中?另外,行
id=id的用途是什么代码>?