江湖传闻,Ajax 是异步调用,自己以前确实也学习过“所谓”的异步调用,然后就开始一直这么用,也没出什么问题。。。
今天,由于一个功能上的Bug,对Ajax的异步调用有了点新认识。
先说一下问题由来:在前端页面上有一些输入框,有一个账号字段+身份证字段,想要对输入的账号+身份证号进行唯一性判断:原来是通过$("#idValue").change(function(){...})来实现唯一性验证的,里面的函数里有个Ajax调用。
被测试的同事查出个Bug:不通过验证也能直接写数据库,原来我想的有些少:在账号字段输入框中输入信息后,直接点保存按钮就能直接修改了。确实想少了,还需要历练。
随后开始对问题进行解决,原本以为挺简单的,在保存按钮的保存事件中添加对内容的验证即可,确实是挺简单的一件事,然后,就是这么一件事,耗费了将近两个小时,可就是变量值不正确:全局变量的值没有被 ajax 的回调函数进行修改,回调函数的返回值总是不正确,还试了很多通过中间变量来传值,然而,一直都没解决掉!!!!
然后百度了“$.ajax 能操作全局变量” 然后出现了如下感人的画面:
太感人了,第一行就看到了原因。。。
原来ajax所谓的异步调用是ajax向后端发送了请求后,就不再等数据传回来了,而是直接执行一下的代码,这样的话,回调函数不能及时返回值,或者全局变量没有被及时修改。这也解释了一个问题,问什么后续代码执行比回调函数了执行的快,原来一切都是
“异步调用”啊,异步调用,异步调用,异步调用。。。。说多了都是泪啊