我想创建一个客户端函数,该函数可以使用客户端变量来接收和执行任意命令。我将使用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 == {}),然后抛出异常,因为数据不包含任何执行方法。这是怎么了?
data == {}
JSON不支持包含function定义/表达式。
function
相反,您可以做的是commands使用所需的functions 定义一个对象,然后传递一个commandName:
commands
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:
fn.apply()
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' ] });