Node.js重复监听器问题

我是node.js的新手,很难掌握事件监听器/发射器的dynamic。 我正在尝试为典型的“新闻源”应用设置一个简单的长轮询监听器。 我可以使用下面的代码注册和发送事件给听众。 我的问题是,每发生一个事件,它被推送到客户端多个(两个或更多!)次。

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请求的两个“注册”请求,我不确定从哪里获取查询源:

//寄存器? = 1304280004069
//寄存器? = 1304280004068

客户端的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调用不会在后台进行,但是页面似乎是“加载”的,直到第一个节点发射(之后它在后台静默运行)。 感谢您的任何build议。

我假设你正在使用jQuery的客户端请求。 它看起来像通过将caching设置为false ,jQuery正在为每个请求添加一个唯一的查询string,以确保您获得新的数据。

您可能还想将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(); } }); }()); });