【问题标题】:WebSocket returns undefined in code but not in consoleWebSocket 在代码中返回 undefined 但在控制台中没有
【发布时间】:2018-10-03 05:03:13
【问题描述】:

我很难理解这里发生了什么......

我在 192.168.1.64:81 上有一个 websocket 服务器

我需要使用这个 javascript 从网页向套接字发送数据:

window.onload = function() {
    var connection = new WebSocket("ws://"+location.hostname+":81", ['arduino']);
    connection.onopen = function() {
        connection.send('Connect ' + new Date());
    };
    connection.onerror = function(error) {
        console.log('WebSocket Error ', error);
    };
    connection.onmessage = function(e) {
        console.log('Server: ', e.data);
    };

    function sendData() {
        var data="#"+joystick.deltaX()+","+joystick.deltaY();
        connection.send(data);
    }};

现在会发生这种情况:如果我打开 js 控制台(在 firefox 中),我会看到“连接未定义”错误...但是如果我将以下行复制粘贴到控制台:

    var connection = new WebSocket("ws://"+location.hostname+":81", ['arduino']);

正确定义了套接字,更新程序开始通过套接字正确地传输数据!!

我错过了什么? 我应该知道一些众所周知的问题吗?

【问题讨论】:

    标签: javascript websocket


    【解决方案1】:

    以下函数使用connection 变量,但该变量超出范围,因为connection 是使用var(本地)关键字定义的:

    connection.onopen = function() {
        connection.send('Connect ' + new Date());
    };
    function sendData() {
        var data="#"+joystick.deltaX()+","+joystick.deltaY();
        connection.send(data);
    }};
    

    要么将 `connection 定义为全局值:

    connection = new WebSocket("ws://"+location.hostname+":81", ['arduino']);
    

    或者使用内部绑定/引用:

    connection.onopen = function(e) {
        e.target.send('Connect ' + new Date());
    };
    sendData = function() {
        var data="#"+joystick.deltaX()+","+joystick.deltaY();
        this.send(data);
    }.bind(connection);
    

    否则将连接初始化为全局并像这样分配 onload:

        var connection;
    window.onload = function() {
            connection = new WebSocket("ws://"+location.hostname+":81", ['arduino']);
            connection.onopen = function() {
                connection.send('Connect ' + new Date());
            };
            connection.onerror = function(error) {
                console.log('WebSocket Error ', error);
            };
            connection.onmessage = function(e) {
                console.log('Server: ', e.data);
    };};
    

    【讨论】:

    • 我之前尝试过第一个选项,但看起来服务器不喜欢同时在端口 81 上加载 html 和接收数据。我现在正在尝试将 ''var connection;'' 定义为全局,然后定义 .onload 何时完成!立即测试!
    • 如果你的服务器不允许并发连接,这是一个更大的问题,因为 WebSockets 连接会阻塞设备。考虑为 Arduino 使用事件服务器库。也许facil.io 可以在嵌入式设备上工作(我有偏见),或者(如果在服务器上使用 JavaScript)考虑 Node.js。
    • .onload 技巧对我来说效果很好,但我猜你说的是真的。这只是一个放错位置的变量 init,但 .onload 的想法很好用!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-09-28
    • 2020-08-05
    • 2020-02-29
    • 2021-02-09
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多