cof*_*uts 29 javascript event-stream node.js express eventemitter
我有一个GET和POST路由的设置,想法是POST到路由触发事件,GET路由是服务器发送的事件流,每次触发POSTed事件时触发...但是,我我觉得我做错了,因为事件听众似乎经常被添加,尽管只有一个事件流订阅者......我做错了什么?
var events = require('events'),
EventEmitter = events.EventEmitter,
rr = new EventEmitter();
app.post('/api/:boardname/remoterefresh', function(req, res){
var boardname = req.param('boardname'),
data = new Date().getTime();
rr.emit("refresh-"+boardname, data)
res.json({data: data})
});
app.get('/api/:boardname/remoterefresh', function(req, res){
var boardname = req.param('boardname')
rr.on("refresh-"+boardname, function(data){
setTimeout(function(){
res.write('data: '+data+'\n\n');
}, 1000)
});
req.socket.setTimeout(Infinity);
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive'
});
res.write('\n');
req.on('close', function(){
console.log('closed')
rr.removeListener("refresh-"+boardname, function(){
//
})
})
})
Run Code Online (Sandbox Code Playgroud)
Far*_*hat 41
您应该将附加的函数命名为事件处理程序.然后在删除它时,您只需按名称传递函数:
app.get('/api/:boardname/remoterefresh', function(req, res){
var boardname = req.param('boardname')
function refreshHandler(data){
setTimeout(function(){
res.write('data: '+data+'\n\n');
}, 1000)
}
rr.on("refresh-"+boardname, refreshHandler);
req.socket.setTimeout(Infinity);
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive'
});
res.write('\n');
req.on('close', function(){
console.log('closed')
rr.removeListener("refresh-"+boardname, refreshHandler);
});
});
Run Code Online (Sandbox Code Playgroud)
基本上removeListener会通过引用查找给定的函数,如果它发现该函数它将从事件处理程序中删除它.
为了避免引用匿名侦听器回调函数,您可以使用emitter.removeAllListeners方法危险地擦除已注册的侦听器:
rr.removeAllListeners("refresh-"+boardname)
Run Code Online (Sandbox Code Playgroud)
请注意,这种方法很容易导致意想不到的副作用(注销在代码库中其他地方注册的侦听器),并且应该保留用于“彻底清除”用例(例如:测试)
| 归档时间: |
|
| 查看次数: |
40838 次 |
| 最近记录: |