2014-10-03 83 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)); } 
    );