通过socket.io发送匿名函数?(Sending anonymous functions thr

2019-07-19 20:42发布

我想创建一个可以接收并使用客户端变量执行任意命令的客户端功能。 我将通过使用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 == {}则抛出异常,因为数据不含有方法执行。 这是怎么回事错在这里?

Answer 1:

JSON不支持列入function定义/表达式。

你可以做的反而是定义一个commands与对象function ,你需要的,只是通过A S 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' ]
});


Answer 2:

You can't send literal JavaScript functions and expect it to work. You'll need to stringify the function first (i.e put it within a set of quotes), then eval the string on the client side.



文章来源: Sending anonymous functions through socket.io?