【问题标题】:callbacks in browser after socket.io emitsocket.io 发出后浏览器中的回调
【发布时间】:2014-10-03 18:58:03
【问题描述】:

我正在开发一种在浏览器页面中获取回调的方法,在向 socketio 服务器发出之后。

服务器代码:

/** exec php file and retrieve the stdout */
socket.on('php', function(func, uid, data) {
    console.log('php'.green + ' act:' + func + ' uid:' + uid);
    runner.exec("php " + php_[func].exec,
    function(err, stdout, stderr) { 
        if (err == null) {
            socket.emit('php', {uid: uid, o: stdout});
            console.log('emitted');
        } else {
            console.log('err '.red + stdout + ' ' + stderr);
        }
    });
});

此代码执行一个 php 页面并检索输出以在浏览器中显示或解析 它接收一个 id 回显到页面,所以我可以知道要执行什么函数

执行回调的浏览器代码:

    function log(text) {
        $('.out').append(text + '<br />');
    }
    window.callbacks = [];

    function setcb(c) {
        var max = 0;
        $.each(window.callbacks, function(index) {max = (index > max ? index : max);});
        window.callbacks[max+1] = c;
        return max+1;
    };
    function C(k){return(document.cookie.match('(^|; )'+k+'=([^;]*)')||0)[2]}

    var s = io.connect("http://"+ window.location.host +":8088");
    //s.emit('debug', 'here');
    s.on('getid', function(){
        console.log('getid cookieis: ' + C('igr') );
        s.emit('setid', C('igr'));
    });


    s.emit('php', 'test',
        setcb(
            function () {
                var data = JSON.parse(this);
                log('callback passed' + this);
            }
        ), null
    );

    s.on('php', function(data) {
        //window.callbacks[j.uid].call(j.o);
        log('rec' + JSON.stringify(data));
        //var jsn = JSON.parse(data);
        console.log(data);
        console.log(window.callbacks[data.uid]);
        window.callbacks[data.uid].call(data.o);
        delete window.callbacks[data.uid];
        window.callbacks.splice(data.uid, 1);
        console.log(window.callbacks);
    });

这是可行的,但是当我尝试同时发出两个请求时,它并没有像预期的那样运行,只剩下一个回调在回调数组中执行。

测试代码:

    s.emit('php', 'test',
        setcb(
            function (data) {log('callback passed' + this);}
        ), null
    );
    s.emit('php', 'test',
        setcb(
            function (data) {log('callback passed' + this);}
        ), null
    );

我想消除这个错误,并且对于收到的每个事件,执行我定义的回调。

【问题讨论】:

  • 您需要发出数据,而不是函数。您还应该在发布之前订阅,但这可能不是唯一的问题,因为服务器行程时间可能会涵盖在堆栈其余部分上花费的时间......它确实比您已经拥有的代码简单得多,请查看套接字.io 示例。简而言之,emit()ing 应该会触发你的 on() 回调,你不需要手动调用它们。

标签: javascript php node.js callback socket.io


【解决方案1】:

这比我想象的要简单得多 您可以通过引用传递回调。 服务器端代码:

/** exec php file and retrieve the stdout */
socket.on('php', function(func, data, callback) {
    console.log('php'.green + ' act:' + func);
    runner.exec("php " + php_[func].exec,
    function(err, stdout, stderr) { 
        if (err == null) { 
            callback(stdout);
            //socket.emit('php', {uid: uid, o: stdout});
            console.log('emitted');
        } else {
            console.log('err '.red + stdout + ' ' + stderr);
        }
    });
});

客户端代码:

    function log(text) {
        $('.out').append(text + '<br />');
    }
    function C(k){return(document.cookie.match('(^|; )'+k+'=([^;]*)')||0)[2]}

    var s = io.connect("http://"+ window.location.host +":8088");
    //s.emit('debug', 'here');
    s.on('getid', function(){
        console.log('getid cookieis: ' + C('igr') );
        s.emit('setid', C('igr'));
    });


    s.emit('php', 'test', null,
        function(data) { log('d: ' + JSON.stringify(data)); }
    );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 2013-12-18
    相关资源
    最近更新 更多