2014-10-03 80 views
0

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

服务器代码:

/** 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 
    ); 

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

+0

需要发射数据,而不是功能。你也应该在你发布之前订阅,但这可能不是唯一的问题,因为服务器旅行时间可能会覆盖剩下的时间花在堆栈上的时间......它比你已有的代码简单得多,请查看套接字.io示例。简而言之,emit()ing会导致你的on()回调触发,你不需要手动调用它们。 – dandavis 2014-10-03 19:00:55

回答

0

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

/** 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)); } 
    );