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