gpt4 book ai didi

javascript - SSE 发射器多次触发,有时浏览器未获取事件

转载 作者:行者123 更新时间:2023-12-03 04:54:28 29 4
gpt4 key购买 nike

我已经在 node.js/express 应用程序中设置了一个事件发射器。它发出的事件由前端监听器捕获。问题是,虽然我可以看到发射被调用一次,但发射器最多发射 4 次相同的事件。此外,虽然通常事件由监听器接收并采取行动,但有时什么也没有发生。有人知道我做错了什么吗?

后端:

app.get('/getStatus', isLoggedIn, function(req, res){
res.writeHead(200, {'Content-Type': 'text/event-stream'});
progressEmitter.on('status',function(newState, job_id, fTime, jobLink){
console.log('Updated state to : ' + newState + ' for job ' + job_id );
res.write("event: state\n");
res.write(`data:${newState},${job_id},${fTime},${jobLink}\n\n`);
console.log(`Emitted state change data! :${newState},${job_id},${fTime},${jobLink}\n\n`);
});

});

前端:

$(document).ready(function () {
var state = [];
var source = new EventSource('getStatus');
source.addEventListener('state', function(e) {
state = e.data.split(',');
for (var ajob in jobsReceived){
if (jobsReceived[ajob].id == state[1]) {
jobsReceived[ajob].status = state[0];
jobsReceived[ajob].finished_time = state[2];
console.log(state[0]);
if (state[0] === 'saved') jobsReceived[ajob].link = state[3];
break;
}
}
$('#table').bootstrapTable('updateByUniqueId', {
id: state[1],
row: {
status: format_status(state[0]),
finished_time: state[2],
link: state[0] === 'saved'? state[3]:''
}
});

});

最佳答案

在花了时间处理其他问题后,我决定头脑清醒地重新审视它,终于得到了解决方案。我将其发布在这里,以防有人遇到同样的问题。

这里发生的是,每次调用 ProgressEmitter.on() 时都会添加一个监听器。当事件发出时,所有监听器都会运行。

为了解决这个问题,必须在请求关闭时删除监听器。这是通过调用emitter.removeListener()来完成的。由于该函数需要的参数是事件名称和监听器函数,因此为监听器函数命名更容易。因此,后端代码更改如下:

app.get('/getStatus', isLoggedIn, function(req, res){
res.writeHead(200, {'Content-Type': 'text/event-stream'});
function statusEvent(newState, job_id, fTime, jobLink){
console.log('Updated state to : ' + newState + ' for job ' + job_id );
res.write("event: state\n");
res.write(`data:${newState},${job_id},${fTime},${jobLink}\n\n`);
console.log(`Emitted state change data!');
}

progressEmitter.on('status',statusEvent);
req.on('close', function(){
progressEmitter.removeListener('event', statusEvent);
})
})

关于javascript - SSE 发射器多次触发,有时浏览器未获取事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42495357/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com