Sending anonymous functions through socket.io?

£可爱£侵袭症+ 提交于 2019-11-29 07:46:07

JSON doesn't support the inclusion of function definitions/expressions.

What you can do instead is to define a commands object with the functions you need and just pass a 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' });

You can also use fn.apply() to pass arguments and check the commandName matches a command with 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' ]
});

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.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!