【问题标题】:websocket javascript read writewebsocket javascript读写
【发布时间】:2012-06-21 21:06:51
【问题描述】:

我试图为 websocket 创建一个 Read\Write 函数,但我遇到了一个问题......

var inarrivo = 0;
var risposta = "";

function RDW_Command(Stringa) {
    var Risposta = "";
    Stringa = "$" + Stringa;
    socket.send(Stringa);
    inarrivo = 0;
    while (inarrivo == 0) {
        doNothing();
    }
    return risposta;
}

function doNothing() {}
socket.onmessage = function (msg) {
    risposta = msg.data;
    inarrivo = 1;
};

问题是当它进入while循环时它会冻结...... 有什么想法可以解决吗? >.

【问题讨论】:

  • Javascript 都是关于异步函数调用的。你应该读到这个。你不能像从其他语言中习惯的那样休眠线程。

标签: javascript html websocket


【解决方案1】:

您以通常(在 javascript 中)基于事件/回调的方式在 javascript 中编写 websockets。

这是一个例子:

var somePackage = {};
somePackage.connect = function()  {
    var ws = new WebSocket('ws://'+document.location.host+'/ws');
    ws.onopen = function() {
        console.log('ws connected');
        somePackage.ws = ws;
    };
    ws.onerror = function() {
        console.log('ws error');
    };
    ws.onclose = function() {
        console.log('ws closed');
    };
    ws.onmessage = function(msgevent) {
        var msg = JSON.parse(msgevent.data);
        console.log('in :', msg);
        // message received, do something
    };
};

somePackage.send = function(msg) {
    if (!this.ws) {
        console.log('no connection');
        return;
    }
    console.log('out:', msg)
    this.ws.send(window.JSON.stringify(msg));
};

您致电somePackage.connect 以打开连接。 之后,消息到达在onmessage 处理程序中处理,并将消息发送到您只需调用somePackage.send 的服务器。

即使这充满了异步调用,但这并不意味着您的程序不会立即对消息的到达做出反应(因为您只有一个线程,因此您的其他函数停止工作)。

【讨论】:

    【解决方案2】:

    这是一个无限循环:

    inarrivo = 0;
    while (inarrivo == 0) {
        doNothing();
    }
    

    解决办法是去掉无限循环。

    【讨论】:

    • 函数:socket.onmessage = function (msg) { risposta = msg.data; inarrivo = 1; };收到消息时应该更改 inarrivo==1 ! >:
    • 该函数永远不会执行,因为浏览器正忙于执行无限循环...
    • 所以不可能以这种方式进行读/写?没有排除其他线程的命令吗?
    • 你只能在 javascript 中获得一个线程(当然你可以使用 WebWorkers 但你仍然需要编写异步代码),所以没有。只需使用回调。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 2016-12-25
    相关资源
    最近更新 更多