用socket.io发送函数的任何方法?

时间:2015-04-21 08:06:32

标签: javascript socket.io

我想用socket.io向浏览器发送一个函数,但没能做到。

在服务器端,我使用emit响应一个函数,但我在浏览器上得到了一个未定义的内容。

有没有办法通过socketio从服务器获取功能?

有我的代码。

// server.js
var static = require('node-static');
var http = require('http');
var file = new(static.Server)();
var app = http.createServer(function(req, res) {
    file.serve(req, res);
}).listen(8000);

io = require('socket.io').listen(app);
io.sockets.on('connection', function(socket) {
    socket.on('schedule', function() {
        console.log('SCHEDULE TASK');
        socket.emit('schedule', function() { console.log('hello world'); });
    });
});

// client.js

var socket = io.connect('http://localhost:8000');
socket.on('schedule', function(fn) {
    fn();
});
socket.emit('schedule');

2 个答案:

答案 0 :(得分:3)

您无法发送实际功能。您可以发送一串Javascript然后将其转换为客户端中的函数。

但是,我建议你真的应该重新考虑一下你在这里尝试做什么。通常,客户端已经拥有它所需的代码(来自它下载的脚本标记),然后发送客户端数据,然后将其传递给已有的代码或用于决定已有的代码的数据。打电话。

如果您向我们展示了您尝试解决的现实问题,我们可能会建议一个比向客户端发送一串Javascript代码更好的解决方案。

如果你真的想发送一个函数,你必须先把它变成一个字符串,然后发送字符串,然后使用字符串通过Function对象将它变回客户端的函数或eval()或使用内联源创建自己的动态脚本标记。

答案 1 :(得分:1)

您只能通过socket.io发送字符串,而不是函数。话虽这么说,我建议你改为发送函数名。

//server.js
socket.emit('schedule', 'helloworld');

//client.js
function helloworld(){
    console.log('hello world');
}
socket.on('schedule',function(name){
    window[name](); //hello world
});