需求简介
现在要对树型组件的叶子节点点击事件进行日志记录,即对下图红框中【选中】的部分进行记录,这里面就存在一个问题,直接点击叶子节点没什么问题,点击一次,就选中一次叶子节点,可以执行一次日志记录接口。但是点击非叶子节点,是会连带着把其所属的所有叶子节点全部选中的,这就等于是在极短的时间内,需要运行可能很多次的服务请求。这就会带来2个问题:1是客户端频繁请求,浪费网络资源,2是服务器可能吃不消。
解决思路
图解
演示图.pptx
创建2个数组。
1个作为临时队列,所有选中叶子节点的数据都会往这里面存储,大小不设限;
另1个作为执行数组,它的大小是有限制的,最大为M(M可以依据实际需求自己制定)。
每隔N秒(建议3
因为日志记录的根本原因是为了分析用户对于对应节点的喜好(基于有效的点击数据才能更高的分析)
代码实现(Angular写法)
tmpQueue = []; // 数组点选日志-临时队列executionArray = []; // 数组点选日志-执行数组timer; // 计时器// 选中事件触发// 所有的选中叶子节点统一推入临时队列fun1() {const queueItem = {OperationTime: new Date(), // 记录选中时间PushTime: '',ModuleId: e.key, // 选中的叶子节点的id};this.tmpQueue.push(queueItem);}ngOnInit() {// 每3s执行一次(N)this.timer = setInterval(() => {// 每次最多推出长度为20的数组(M)if (this.tmpQueue.length > 0) {this.executionArray = [];this.executionArray = this.tmpQueue.splice(-20, 20); // 取出后20个,先进先出const tempDate = new Date(); // 记录推送的时间this.executionArray.forEach(element => {element.PushTime = tempDate;});// 构建日志参数const params = {token: '',data: this.executionArray};// 推送// …………}}, 3000);}ngOnDestroy() {// 清除timer(退出当前页面时一点要清除,避免重复添加)clearInterval(this.timer);}
