这应该是我遇到最有意思的bug了,由于是公司内网项目我就不展示项目截图了,这个bug是我一个朋友问我的,他们公司做的统计医疗器械的系统。
功能简述:表格里每一行是可以选中的可以多选,每一次选中一行就会在底部统计你选中这些行设备的的总月销量。表格数据量很大,在每行的表格中并没有展示月销量,而是需要在点击这一行的时候拿到这一行的id后,去请求接口然后获取到此行的月销量,然后把你选中行的月销量加在一起,最后显示到底部总月销量。
奇怪的点:这个系统一年前就做好了,期间一直只给他的大领导用(一直没问题),可以最近换了一个年轻的领导之后,使用此系统算月销量的时候就有问题。
问题代码:
// 极度简化的代码
async function fetchCount(id){//根据选中这行的id去请求获取这行的月销量
传入id是多少返回月销量是多少
}
let count = 0 //统计设备的月销量
async function addCount(id){
count += await fetchCount(id) //count = count + await fetchCount(id)
}
addCount(1) // count:0 + 等待 -> 0+1 = 1
addCount(2) // count:0 + 等待 -> 0+2 = 2
// 2
多线程条件竞争问题,js不是多线程,但是js是异步的 。
如果你在一个表达式中 把异步数据和同步数据混合运算 一但这个异步行为上并发的,就会出现问题。
例:[...xxx , await xxx] 就会有问题
解决很简单
// 极度简化的代码
async function fetchCount(id){//根据选中这行的id去请求获取这行的月销量
传入id是多少返回月销量是多少
}
let count = 0 //统计设备的月销量
async function addCount(id){
const n = await fetchCount(id)
count = const + n
}
addCount(1)
addCount(2)
为什么大领导没这个bug呢? 我丢!因为大领导年纪大了 点的太慢了。