NodeJS将变量传递给已定义的回调函数
NodeJS passing variable to already defined callback function
考虑以下代码:
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编写的非常基本的通知服务器的一部分。它使用redisnpm包。由于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) );
相关文章:
- 要求多页&多应用程序未执行定义回调
- 为从AJAX调用中utlizes DATA参数的函数定义回调
- 如何向jquery插件添加自定义回调
- 如何在javascript中对用户函数进行自定义回调
- 为什么在定义回调/侦听器函数(异步消息传递,port.on)后没有立即设置全局变量
- 自定义回调护照
- 在 JavaScript 中为所有事件类型定义回调函数
- 为什么使用 api 调用在函数内定义回调函数会引发“未捕获的引用错误”
- 如何在异步库的“Each”函数中定义回调
- 当无法定义回调时使用angularjs JSONP
- .animate()的jQuery自定义回调
- Javascript自定义回调函数不工作
- require.js-未定义的模块作为参数传递以定义回调
- 找不到Angular.js Angular拖放自定义回调函数
- 在带有已定义回调函数的JSONP中使用$.when
- 为节点函数定义自定义回调
- jQuery插件的自定义回调函数
- 在Meteor中运行的回调中未定义回调参数
- 给一个提供的NodeJS回调我自己的自定义回调
- Javascript添加带有自定义回调的事件侦听器