var WebSocket = require('ws')
var ws = [];
for (var i = 0; i < 10 ; ++i) {
ws[i] = new WebSocket('ws://127.0.0.1:9898/echo/websocket');
ws[i].on('open', function() {
ws[i].send('why');
});
}
我试图用nodejs打开10个websocket连接,但不知何故我的循环不起作用。我的代码出了什么问题?感谢
答案 0 :(得分:3)
正如Nitzan Shaked所说,您的问题是由于循环问题造成的。当回调开始触发时,此处i
的所有9
值均为var WebSocket = require('ws')
var ws = [];
for (var i = 0; i < 10 ; ++i) {
ws[i] = new WebSocket('ws://127.0.0.1:9898/echo/websocket');
ws[i].on('open', generator(ws[i]));
}
//generator makes a function with present object and returns it
var generator = function (k) {
return function() {
k.send('why');
}
}
。
作为通用解决方案,使用简单的闭包解决它。
ws[i]
但是,针对您的上下文的最简单方法是将this
替换为var WebSocket = require('ws')
var ws = [];
for (var i = 0; i < 10 ; ++i) {
ws[i] = new WebSocket('ws://127.0.0.1:9898/echo/websocket');
ws[i].on('open', function() {
this.send('why');
});
}
{{1}}
答案 1 :(得分:0)
经典Javascript循环陷阱。看这里:Javascript infamous Loop issue?。
基本上在调用回调时,ws[i].send(...)
,i
指的是循环的 end 处的i
,而不是您定义的位置回调。
编辑 - 正如Casey Chu所说,我的代码示例中有一个愚蠢的错误。我没有修复它并提出其他答案的副本,而是向您推荐(当前)其他2个完美有效的答案。