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 == {}),然后抛出异常,因为数据不包含执行方法。这里出了什么问题?

4

2 回答 2

8

JSON 不支持包含function定义/表达式。

你可以做的是commands用你需要的 s 定义一个对象,function然后传递一个commandName

// 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 回答