需求大概是这样滴
有一个界面,有一颗树,显示各种节点。用户可以点击 /右键任意一个节点,添加 /删除或者重命名,或者选择某节点后,显示一个面板,然后修改属性,等等。
但是,任意操作后,需要对应修改同一个文件,然后该文件会上传到服务器上(这个操作需要 3~5 秒,比较费时)
但是,“被要求”,每次修改后,立即执行文件保存并上传的操作(添加一个“保存”按钮,等都修改完成后,再保存提交它不香么?)。这样的话,用户每次操作,都要等待 5 秒,才能执行下一步操作。还不让我们把界面上的菜单灰掉(本来想操作没有执行完,菜单就灰掉,暗示 /强制 用户,现在不能操作)
所以,问题来了。现在我想使用一个 queue ,有点类似 message queue ,只是这个是本地的(有点像生产 /消费模型)。用户只管在界面上操作,每次动作类型和修改的数据,都添加到这个 queue 里面去。然后,monitor 这个 queue ,有内容了,就取一条,执行操作,保存,上传。然后再去 queue 里面取一条,blabla...
不知道有没有成熟的 npm package 做这个?还是说,只能再造一个轮子?或者,大家有什么想法?
谢谢
p.s.1
好像 saga 里面有个 event channel ,是类似这样的。我们的环境里面本来就使用了 redux/redux-saga
可以试试每次用户的操作,emmit 一个消息到这个 channel ,然后这个 channel 里面,循环监听,处理消息,上传文件。
p.s.2
react + typescript + redux + redux-saga
1
star7th 2021-10-27 09:50:03 +08:00
js 的网络请求不本身就是异步的吗。你不要把动作写在回调函数里面就行。
|
2
shyrock 2021-10-27 10:30:10 +08:00
如果只是把操作串行化,我理解一楼说的就是答案。
但是,如果后端返回和前端刷新不做串行化的话,有可能点击操作的节点是刚刚刷新出来的新节点,而不是用户当时想点击的节点,这可以接受吗? |
3
2i2Re2PLMaDnghL 2021-10-27 10:46:14 +08:00
意思是用户操作得够快两秒进行了 17 次操作,然后就需要 85 秒来上传这 17 次操作?
不告诉用户正在上传,用户过了十秒把页面关掉了,这剩下的 15 个操作是不是就丢失了? |
4
maichael 2021-10-27 11:09:52 +08:00
“每次修改后,立即执行文件保存并上传的操作”,需求本身就很奇怪,这么高耗时的请求竟然要频繁触发,脑子有洞才会这么设计。
本身请求就是异步的,不用搞什么队列,不搞阻塞就行了,像 1 楼说的。 |
5
0Vincent0Zhang0 2021-10-27 11:14:00 +08:00
把这些要提交到服务器上的动作打包成消息,然后放入队列中,再加上一个 setTimeout 来处理这个动作消息队列,提交到服务器上,这样就能提高用户的使用体验了。
如果这个用于上传队列内容的 function 能够如果能一定程度上对队列中的内容进行合并的话,就可以减轻服务器的压力了。 |