Miloer の 闲言碎语

同步执行引起的小Bug

alt text

起因

需求是这样的,点击按钮,查询的时候,body 动态加载个“加载动画”。需求很明确,也确实很简单。

开始

项目前提里有一部分必须是同步执行的。
当时就全局设置

1
2
3
$.ajaxSetup({
async: false
});

同步模块结束以后,我忘了在改过来了。

然后小Bug 就产生了。

正常进程状态: 点击查询按钮->Body添加节点,节点里内容为(等待Loading)->按条件进行搜索,返回数据(2s左右)->生成图形报表->更改Loading状态->生成图形报表图片。

Bug进程状态: 点击查询按钮->Body添加节点(这里节点生成了,但节点里的内容【等待loading】等待并没有出来)->按条件进行搜索,返回数据(2s左右),这时候节点内容出来了->生成图形报表->更改Loading状态->生成图形报表图片。

我在浏览器里测试时,还在奇怪。节点出来了,但是节点内容的标签当时是点不出来的,当时的进程应该是正在获取数据,有了数据又返回来执行加载节点内容。

还有这种操作?

另一个问题

我记得前些日子还有一个挺奇怪的问题,现在也没确定问题的所在,程序是在异步里执行的,生成一个大的二维数组数据,获取这个数据要级联七八个表,而且表里的内容格式还很复杂,还要对内容进行二次处理,大约5-6秒的时间 (时间不稳定)。/笑哭。

获取数据后,先输入这个二维表格,在输出二维表格里的某一行的数据(这三个是放在一个事件里的),像这样:

1
2
3
console.log(subTable);
console.log(subTable[1][1]);
console.log(subTable[2][1]);

然后问题出现了,subTable的数据全出来了,但是后面的两个数据,还是默认的数据!!

我又测试了几次,响应时间短的时候,这两行的某一个数据能出来,有时候还是初始数据。因为当时项目赶得及,我把代码结构就给改了,现在还原也还原不过来了。。。

不过倒是有几点不靠谱的猜测,不过我感觉最可能的是,那时候的代码环境复杂。我所描绘的事件并不是完全事件。。

事后,我试着还原整个事情的经过,但是都没有到达那时的诡异效果。

(完)