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
);
我想消除這個錯誤,並且接收到的每個事件,執行我定義回調。
需要發射數據,而不是功能。你也應該在你發佈之前訂閱,但這可能不是唯一的問題,因爲服務器旅行時間可能會覆蓋剩下的時間花在堆棧上的時間......它比你已有的代碼簡單得多,請查看套接字.io示例。簡而言之,emit()ing會導致你的on()回調觸發,你不需要手動調用它們。 – dandavis 2014-10-03 19:00:55