0
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 连接,但不知何故我的循环不起作用。我的代码有什么问题?谢谢

4

2 回答 2

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');
    });

}
于 2013-10-09T04:15:43.603 回答
0

经典的 Javascript 循环陷阱。看这里:Javascript臭名昭著的循环问题?.

基本上在调用回调的地方,ws[i].send(...),i是指i在循环结束时,而不是在您定义回调的地方。

编辑——正如 Casey Chu 所指出的,我的代码示例中有一个愚蠢的错误。我没有修复它并提出其他答案的副本,而是向您推荐(当前)两个完全有效的其他答案。

于 2013-10-09T04:04:54.757 回答