我想创建一个客户端函数,它可以使用客户端变量接收和执行任意命令。我将从我的服务器发送这些函数,使用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 == {}
),然后引发异常,因为数据不包含方法执行。这里出了什么问题?
答案 0 :(得分:7)
JSON不支持包含function
定义/表达式。
您可以做的是定义一个commands
对象,其中包含您需要的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' ]
});
答案 1 :(得分:2)
您无法发送文字JavaScript函数并希望它能够正常工作。您需要首先对函数进行字符串化(即将其置于一组引号内),然后在客户端评估该字符串。