关于AJAX同步和异步的研究

近日在开发的过程中遇到一些逻辑判断上的需求,例如有时候必须通过AJAX给服务器交互,然后等response的数据来判断下一步的逻辑关系。但是如何都不能把response的内容给取出,有点奇怪。必须要我在callBack内容里面加上对应成功或者失败的function。但其实我使用的这个function就判断请求true或者false就可以了,没必要在里面加function,因为想封装成一个工具类。

然后静下,想了一下AJAX的机制,觉得原因是出在机制上。跟同事讨论了一下后,确定问题所在了。然后再进行调试,结果出来了。所以分享一下。



首先,下面是一个普遍常见的发送XMLRequest请求的一段代码


var _bool = false;

request.open("POST", url, true);

request.onreadystatechange = function callBack(){

var response = request.responseText;//假设response等于true

_bool= response;

/*调试1*/

}

request.setRequestHeader("Content-Type",

"application/x-www-form-urlencoded");

request.send(parameters);

/*调试2*/

/*后续操作*/

if(_bool){

//对应的操作

}else{

//对应的操作

}



虽然后续操作可以直接放在callBack里面的,但是我们现在姑且这样做吧。实际上也是没什么问题。

操作结果无聊response的值返回的是任何,都返回一个false。开始就以为是赋值,或者变量作用的问题。反思之下觉得没什么错误之处。


在调试1和调试2的位置分别加入alert调试。

顺序是 调试1→调试2


信息分别都是true和false。更加觉得奇怪了。


容易被遗忘的AJAX机制-------同步synchronous和异步asynchronous


同步和异步,总结一下自己的经验:


1、如果是异步的话,注意request某些情况下会被覆盖。即第一个异步请求服务端没返回,第二个提交出去了。而使用同一个request对象的话,第一次 的就被覆盖了。所以永远就只能得到一个返回数据了。所以异步情况下,推荐不使用全局request比较好。但request需要传参囖。并且回调函数使用 完毕的时候记得初始化一下。


2、在异步的情况下,JavaScript代码浏览器是直接全部运行完毕的。那么AJAX服务端返回的response应该谁来接收?刚开始很多人都有这个疑问,都很容易的误认为是JavaScript来接收然后作处理。

其实不然,JavaScript代码执行后,剩下的任务交给了浏览器。一个默默无闻的代码翻译者。是它把一大串乏味的html等代码转换成各种字体,图案,样式给浏览者。

而在同步的情况下,XMLRequest请求发送之后,后续的JavaScript代码不会继续执行,浏览器会一直等response之后在继续。这段时间里面,访问者也不能作其他操作。

其实与AJAX服务端交互的时间十分之快,基本上同步和异步,普通的调试是很难差别所在。除非在服务端进行一下sleep这样的操作。


其实说到这里,之前的问题所在应该就有头绪了。之所以Response获取不了,是因为之后接收的response其实等于一个单独的个体了。也就是AJAX的精髓所在,异步请求的作用。

所以就算顺序是我们想要的,即先alert 调试1的位置,然后调试2。但是值还是获取不了。


上面代码中,只要把

request.open("POST", url, true);

里面的true改为false。我们想要的结果就实现了。

关于异步和同步,必须记住他们的不同点,然后才能灵活运用。虽然很多情况下是不存在任何差别的。但在不断的开发过程中,他们的细微差别可能对你的程序带来十分大的影响。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值