1

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 ループに入るときにフリーズすることです....それを修正するアイデアはありますか? >.<ありがとうございます!アンドレア

4

2 に答える 2

8

通常の (javascript での) イベント/コールバック ベースの方法で、javascript で websocket をプログラミングします。

例を次に示します。

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

これが非同期呼び出しでいっぱいになったとしても、プログラムがメッセージの到着にすぐに反応しないという意味ではありません (スレッドが 1 つしかないため、他の関数が動作を停止するとすぐに)。

于 2012-06-21T12:55:10.357 に答える
3

これは無限ループです。

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

解決策は、無限ループを削除することです。

于 2012-06-21T12:09:39.367 に答える