# 队列在前端项目中的应用
这次总算是用上了数据结构啦,不然我自己也快忘了,知识只有在使用的前提下,才是活的知识,才不容易忘记。这次在项目中用到的是队列,当然这里不是为了秀,只是为了记录、总结,分享开发中的心得。
任务需求是控制多个弹窗的展示,需要有优先级,同时也需要根据数据的状态,来展示不同的弹窗。如果是直接通过硬编码的形式控制,通过if-else
其实也可以解决这个问题,但这会导致代码的耦合,不利于后期的维护和迭代,如果需要增加弹窗,反而还需要一段一段的修改,而通过队列控制,每一个弹窗都是一个函数,是否展示根据每个函数调用的结果来保证,好了我们来说说具体思路吧!
# 具体思路和代码
需求:现在有A、B、C三个弹窗,需要在app首页展示,需要控制它们的展示顺序,展示顺序是A——>B——>C...等,每个弹窗只展示一次。当A弹窗展示之后,叉掉A弹窗,才会再展示B弹窗,以此类推。但也会有一种情况,比如在app首页展示了A,但是用户未操作,直接点击到app个人中心,当再次进入首页时,需要展示B弹窗,以此类推。
大致的需求如上,其中还有一些小的细节,在这里就省略了,我们现在需要来对它进行实现。
let APopShow = getStorage('APopShow')
let BPopShow = getStorage('BPopShow')
let CPopShow = getStorage('CPopShow')
if(!APopShow) {
AShow = true
setStorage(!AShow)
return;
}else if(!BPopShow) {
BShow = true
setStorage(!BShow)
return;
}else if(!CPopShow){
CShow = true
setStorage(!CShow)
return;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
上面就是一个最简易的代码了,这个伪代码
非常的简洁,if - else if - else if ....
通过一系列的if-else
来控制展示的顺序。这里会封装为一个公用的弹窗组件,来控制多个弹窗的展示。
# 使用队列优化
队列可以很好的解决这个问题,避免大量的if-else
,队列是先进先出,通过队列控制函数调用,而函数中就是具体的业务逻辑了。我们这里是用队列的知识,不是完全照搬队列!!
let Queue = [];
let AShow = false;
let BShow = false;
let CShow = false;
function pushQueue(fnc) {
if(fnc instanceof Function){
Queue.push(fnc);
}
}
function runQueue() {
for(let fn item Queue) {
fn();
}
}
function AFunc() {};
function BFunc() {if(AShow) return false;};
function CFunc() {if(BShow) return false;};
pushQueue(AFunc);
pushQueue(BFunc);
pushQueue(CFunc);
runQueue();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
队列只是负责允许就是了,而具体的业务逻辑,在各自的业务函数中,自己去实现就可以了,我们在这里做到了一定程度的代码分离。当然这只是简易的代码实现,具体的细节可以调整和优化。
在这里通过队列,对代码进行了解耦,也利于后期来扩展和维护了。以上就是通过队列实现的逻辑了,其实还可以通过订阅发布模式来实现,控制多个弹窗的展示,拆分多个组件,通过全局的状态,同时通过发布订阅,来控制弹窗的展示和顺序。大家也可以考虑一下!!
# 可以解决哪些问题
项目中解决的问题:
1.控制调用顺序,先进先出;
2.多个弹窗的执行顺序;
3.大量请求,缓解服务器请求压力;
4.消息队列;
。。。等
2
3
4
5
调用优先级的问题;控制执行顺序;
# 扩展
有一个需求,在一个事件中需要发出1w个请求,是一次性发出1w个,还是通过其他方式来进行控制合理呢?留待思考🤔吧!!
ps: 微信公众号:Yopai,有兴趣的可以关注,每周不定期更新。不断分享,不断进步
男性,武汉工作,会点Web,擅长Javascript.
技术或工作问题交流,可联系微信:1169170165.