4

クライアント側変数を使って任意のコマンドを受け取り実行できるクライアント側関数を作りたいです。これらの関数をサーバーから送信するには、socket.io を使用して、コマンドとなる匿名関数を含む JSON オブジェクトを送信します。次のようになります。

//client side

socket.on('executecommand', function(data){
    var a = "foo";
    data.execute(a); //should produce "foo"
});

//server side

socket.emit('executecommand', {'execute': function(param){
    console.log(param);
}});

しかし、試してみると、クライアント側は空の json オブジェクト ( data == {}) を受け取り、データにメソッド execute が含まれていなかったため、例外をスローしました。ここで何がうまくいかないのですか?

4

2 に答える 2

8

functionJSON は、定義/式の組み込みをサポートしていません。

代わりにできることは、必要な sを使用してcommandsオブジェクトを定義し、単に a を渡すことです。functioncommandName

// client-side

var commands = {
    log: function (param) {
        console.log(param);
    }
};

socket.on('executecommand', function(data){
    var a = 'foo';
    commands[data.commandName](a);
});
// server-side

socket.emit('executecommand', { commandName: 'log' });

を使用fn.apply()して引数を渡しcommandName、次のコマンドとの一致を確認することもできinます。

// client-side
var commands = { /* ... */ };

socket.on('executecommand', function(data){
    if (data.commandName in commands) {
        commands[data.commandName].apply(null, data.arguments || []);
    } else {
        console.error('Unrecognized command', data.commandName);
    }
});
// server-side

socket.emit('executecommand', {
    commandName: 'log',
    arguments: [ 'foo' ]
});
于 2013-02-14T00:02:17.637 に答える
4

リテラルJavaScript関数を送信して、それが機能することを期待することはできません。最初に関数を文字列化する(つまり、引用符のセット内に配置する)必要があります。次に、クライアント側で文字列を評価します。

于 2013-02-13T23:32:49.910 に答える