我试图用nodejs打开10个websocket连接,但不知怎的,我的循环不起作用

时间:2013-10-09 01:33:43

标签: node.js

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

2 个答案:

答案 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个完美有效的答案。