遇到一个ajax同步和异步的问题,解决了很久,终于找到了错误。

一、问题场景

总是获取不到username,永远是undefined,找了很久都没找到原因。

后来试了一下用alert去测了onload里的函数执行顺序,发现永远是先访问了websocket服务器,再去取得username。

然后我就不能理解了,js不是按照函数执行顺序来执行的吗,怎么后面的代码反而后发先至了?

二、尝试解决

我猜想ajax的提交方式是不是存在什么问题。

原来,在默认情况下,ajax的提交是异步的:

ajax和getusername方法其实是并行的关系。getusername直接return了,ajax还在执行中,还没能复写username变量,所以username一直就是undefined的。

三、解决方案

google了一下,如何将ajax的请求从异步改为同步:

最终发现了这样的一个属性:async: false

加上之后:

问题最终得以解决。ajax变成同步操作,执行到ajax会被阻塞。getusername会等待ajax执行完后,才return。

四、总结

无论何时都要注意同步和异步导致的函数执行顺序不同的问题。

特别是到了各种异步操作的场景,既要保证异步的高效率,又要保证结果的先后顺序,需要仔细考虑。

发表评论

电子邮件地址不会被公开。 必填项已用*标注