10.使用 EventSource 实时获取消息数,用来角标显示数量

前几天写的一个在菜单图标上面显示消息数量,先记一下上次获取的消息的操作

上次消息数是通过设置一个定时器,每隔一段时间就进行一次Ajax请求,查询数据库符合条件的数据条数

因为要不断对服务器进行请求,所以时间间隔设置稍微长一点,获取的数据存在sessionStorage里面,第一次载入页面的时候先判断sessionStorage里面有没有值,没有的话立即执行请求

后来又有其他的消息也要在这个页面上显示,然后去看了一下之前的项目角标显示的方法,发现是使用了 EventSource 的方法获取的,EventSource 是服务器每隔一段时间向客户端推送消息  Web 开发技术-EventSource

EventSource 接口用于接收服务器发送的事件。

它通过HTTP连接到一个服务器,以text/event-stream 格式接收事件, 不关闭连接。

 new EventSource(url); 指定要请求的url

es.open 是与服务器连接成功执行的函数,

es.onmessage 是收到服务器的数据执行的函数,

es.onerror 是执行出现错误时执行的函数,

这里在每次接收到服务器的数据后就设置该消息的角标数量

function comet(cmd, el, module) { 
	var url = '';
	var es = new EventSource(url);
	// es.onopen = function (es) {
	//     console.log('消息链接已打开');
	// };
	es.onmessage = function (ev) {
		var rs = JSON.parse(ev.data);
		if ('0' == rs.erron) {
			document.getElementById(el).innerText = (rs.data instanceof Object ? rs.data[0].total : rs.data) == 0 ?
				'' : (rs.data instanceof Object ? rs.data[0].total : rs.data);
			console.log('<- '+ (module||'') +'收到消息', rs);
		} else {
			msg.warn('数据取出现异常');
			es.close();
		}
	};
	// es.onerror = function (err) {
	//     console.log('消息链接发生错误' + err);
	// }
}

 后端设置返回头的格式为 text/event-stream ,data是数据字段,retry是间隔时间,要使用\n\n结尾

context.Response.ContentType = "text/event-stream";
context.Response.Write("data:" + num + "\n\n" + "retry:"+10000+"\n\n");
context.Response.End();

 参考文章:HTML5—EventSource服务端推送事件 

这样客户端就能每隔10秒收到服务器的消息推送了

在Vue2中使用`fetch`配合`EventSource`(Server-Sent Events)接收和显示流式文本是一个常见的实践,特别是在需要实现实时更新的情况下。下面是一个简单的示例: 首先,在组件里安装`axios`(用于`fetch`)和`vue-eventsource`插件,它们可以帮助简化`EventSource`的使用: ```bash npm install axios vue-eventsource ``` 然后在`.vue`文件中引入并设置: ```html <template> <div id="stream-view"> <p v-if="message">{{ message }}</p> <!-- ...其他内容... --> </div> </template> <script> import axios from 'axios'; import { eventSource } from 'vue-eventsource'; export default { data() { return { message: '', }; }, mounted() { const es = eventSource('your-server-url', { /* 可选配置 */ }); es.on('data', (event) => { this.message = event.data; // 如果你想实时渲染,可以用v-html或innerHTML // 这里仅为了简单展示,所以只是替换文字 this.$refs.streamView.innerText = this.message; }); es.on('error', (err) => { console.error('Error occurred:', err); }); es.onclose(() => { console.log('Connection closed'); }); }, beforeDestroy() { es.close(); // 关闭连接,防止内存泄漏 }, }; </script> ``` 在这个例子中,我们监听`'data'`事件来获取服务器传来的流式文本,将其存储在`this.message`中,然后更新视图。如果遇到错误或连接关闭,相应的处理函会被触发。 请注意,你需要将 `'your-server-url'` 替换为你实际的服务器地址,该地址应该提供一个支持 SSE 的接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值