我有以下代码:
var dgram = require("dgram");
var start = 27015;
for(var i = start; i < (start + 100); i++)
{
var server = dgram.createSocket("udp4");
server.on("message", function(msg, sender) {
console.log(server.address().port)
});
server.bind(i);
}
为什么它始终输出最后端口(27114)?
怎么了?我认为这有助于识别接收服务器的端口。
谢谢。
答案 0 :(得分:3)
使用闭包来捕获回调的server
:
server.on("message", (function (server) {
return function (msg, sender) {
console.log(server.address().port);
};
})(server));
我不确定on
方法的工作原理,但在正常的JavaScript事件处理中,this
指的是事件适用的对象。因此,您可能会忘记关闭,只需使用this.address().port
来引用事件发生的特定server
。
设置它的另一种方法是:
server.on("message", getOnHandler(server));
function getOnHandler(s) {
return function (msg, sender) {
console.log(s.address().port);
};
}
答案 1 :(得分:3)
伊恩走在正确的轨道上 - 你需要一个关闭。但是,他的方式会导致服务器取消引用。
for(var i = start; i < (start + 100); i++) {
(function(port) {
var server = dgram.createSocket("udp4");
server.on("message", function(msg, sender) {
console.log(server.address().port)
});
server.bind(port);
})(i);
}
这将导致每个server
实例在闭包内被隔离但不会被解除引用。它们将保持现有状态,而不会被范围问题覆盖。
答案 2 :(得分:1)
你已经成为变量提升和词汇范围的牺牲品。
您的代码与此相同:
var dgram = require("dgram");
var start = 27015;
var i;
var server;
for(i = start; i < (start + 100); i++)
{
server = dgram.createSocket("udp4");
server.on("message", function(msg, sender) {
console.log(server.address().port)
});
}
这意味着server
始终是回调中服务器的最后一个赋值(从技术上讲,它将是执行回调时指向的任何值server
- 除非虽然它在绑定期间被调用,但它总是最后一个。)
您可以使用Ian建议的闭包,但我怀疑this
也将设置为回调内的服务器。 (或者至少是某种方式来访问它。你必须检查文档。)