今天做课设,让我遇到了一件最诡异不过的事情。因为我已经改完了,忘记把错误的地方截图了,就在这里简单描述一下:我把要展现的药名储存在一个var数组中,然后for循环依次根据药名去数据库中检索相关信息再加载到网页上,然后让我奇怪的地方来了:按照常理来说应该是每一行的信息都是一种药物的,然后药物名称显示的却都是最后一种药物的(for循环最后一次的药物),其他的信息却是原本的药物的!也就是说,除了名字以外都是正常的!
这真的让我困惑不已,因为如果一行数据全部错误还好,说明代码逻辑出了问题,但是这种有的对有的不对的情况就非常难以解释,最后我上网查询了一下ajax请求错乱的问题,终于发现了问题所在:
原因就在于for循环是一个单线程的东西,而ajax是多线程的,之所以称之为异步同步,是因为执行到ajax的时候去后台开启了一个线程,但是for循环本身就是一个单线程的东西,那么执行到ajax的时候,ajax开启了一个线程,for循环是没有等他的,知道for循环结束的时候,才会把ajax返回的数据拿回来,所以会出问题。
我的理解就是for循环的速度和ajax请求的速度不一致,导致有些内容是传输过来有些内容还没有传输过来就到下一个for循环了。
解决办法:利用递归
只需要改变for循环判断的结束的位置,为每次循环的异步请求结束时,再进行下一次的循环。
可以在原本for循环中把代码写到function里面再执行,也可以直接递归执行。