我是node.js的新手,很难掌握事件侦听器/发射器的动态。我试图建立一个简单的长轮询监听器为一个典型的"新闻源"应用程序。我能够注册和发出事件与下面的代码监听器。我的问题是,每次发出事件时,它都会被多次(两次或更多!)推送到客户端。
var http = require('http'),
events = require('events'),
url = require('url');
var event_emitter = new events.EventEmitter();
http.createServer(function(req,res) {
var uriParse = url.parse(req.url,true);
var pathname = uriParse.pathname;
console.log(req.url);
if (pathname=="//register") {
var thisRes = res;
event_emitter.addListener('event',function(actionid){
if (thisRes) {
thisRes.writeHead(200, { "Content-Type": "text/plain" });
thisRes.end(actionid);
thisRes = null;
}
});
} else if (pathname=="//emit") {
var actionid = uriParse.query.id;
event_emitter.emit('event',actionid);
console.log('event',actionid);
res.writeHead(200, { "Content-Type": "text/plain" });
res.end('success');
}
}).listen(3000,"127.0.0.1");
console.log('Server running at http://127.0.0.1:3000/');
控制台日志显示每个ajax请求的两个"注册"请求,我不确定从哪里?get查询起源:
//注册吗?
= 1304280004068
= 1304280004069//注册吗?
客户端ajax调用(位于html正文中):
$(document).ready(function() {
function callNode() {
$.ajax({
url: '/node/register',
cache: false,
timeout: 100000 * 1000000,
success: function(data) {
function doSomethingWithData(newaction) {
$('#feed').prepend(newaction);
}
$.get('/news/'+ data+'/', doSomethingWithData);
callNode();
}
});
};
callNode();
});
最后,另一个问题是ajax调用不是在后台发生的,但是页面似乎在"加载",直到第一个节点发射(之后它在后台静默运行)。谢谢你的建议。
我假设您正在为客户端请求使用jQuery。看起来,通过设置cache为false, jQuery为每个请求添加了一个唯一的查询字符串,以确保您获得新数据。
您可能还想将doSomethingWithData方法移出AJAX调用,以使其更易于阅读。
$(document).ready(function() {
function doSomethingWithData(newaction) {
$('#feed').prepend(newaction);
}
(function callNode() {
$.ajax({
url: '/node/register',
cache: false,
timeout: 100000 * 1000000,
success: function(data) {
$.get('/news/'+ data+'/', doSomethingWithData);
callNode();
}
});
}());
});