tabs切换数据乱了,原来是竞态条件和数据竞争问题
遇到一个业务场景,tabs切换三个标签页。每切换一个tabs,就会请求一次数据,然后把数据放到已经清空的一个数组内。那么因为有的数据多,有的少。就会造成第二个tabs的数据展示到第三个tsbs内。虽然这些数据会在切换时候拨乱反正。但这是个大问题。
百度后发现了有意思的事,这样的问题,最早出现在我还在读圣贤书的时候。而互联网大喷发时期则没多少。直到2022年8月5号左右,字节跳动,飞书发了这些文章去解决这个竞态问题。
2...飞书---前端提到的竞态问题,在 Android 上怎么解决?
3...otter---如何解决异步请求的竞态问题.三年前
看了这些顶级团队和顶尖大佬写的文章,我倍受启发。但是考虑到自己太菜,我准备从简单的手段搞起
第一点:这个问题为什么出现,不给这个问题开始的机会
1.分析其问题,乖徒儿,你指定没写loading!!
写了loading,会阻隔用户的非法操作,所以这种情况会被消灭在萌芽。这才是最靠谱的。此方法不适用于·数据竞争
第二点:问题发生了,怎么最小化影响?
1...撤回请求
如何挽回错误。比如你告白信息发给了你的领导,啊,这多是一件美事。
这个时候,你担心你领导看到了,怎么办?挽救啊,撤回鸭!
总结一下:
1.XMLHttpRequest 取消请求
2.fetch API 取消请求
3.axios 取消请求
4.可取消的 promise
详见字节的链接字节---如何解决前端常见的竞态问题
2...当请求都成功了,也来不及撤回了
1.指定是做数据区分,从数据层面将不同数据隔离起来
tabs1的结果放进data内,tabs2的数据也放到data内,好,tabs的数据也放进去。就在请求时候置空一下data。不够呀,小果子。这牵扯到了专业名词数据竞争
。
补充知识点:竞争条件与数据竞争
先来个引用原文 ANTOINE VAN DER LEE--- Race condition vs. Data Race: the differences explained 本文详细解释了,竞争条件与数据竞争的区别。解释的特别到位。值得一看
总结一下
其实,我个人更推荐写loading,相对而言不麻烦。要是撤回请求,数据区分,就稍微有点头痛了
转载自:https://juejin.cn/post/7146117854486609956