近日在开发的过程中遇到一些逻辑判断上的需求,例如有时候必须通过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。我们想要的结果就实现了。
关于异步和同步,必须记住他们的不同点,然后才能灵活运用。虽然很多情况下是不存在任何差别的。但在不断的开发过程中,他们的细微差别可能对你的程序带来十分大的影响。
分享到:
相关推荐
详细介绍了AJAX的通信过程 同步或者异步 值得一看
用法 XMLHttpRequest的用法 ajax同步和异步的区别
最近的项目用了到AJAX同步。这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出去假死状态,当这个AJAX执行完毕后才会继续运行其他代码页面假死状态解除。 而异步则这个AJAX代码...
通过ajax向后台发送和接收数据时,常常会出现同步异步问题。这篇文章给大家介绍Ajax同步和异步问题浅析,需要的朋友参考下
对新手学ajax 有帮助。希望大家能够喜欢和利用。
原生ajax代码实现异步提交,用传统的ajax实现异步提交判断用户名是否存在,详细和完整的步骤,可运行
2 同步:MyAjaxs " 要调用的方法页面 方法" 参数 function d {alert d["d"] ;} ;">调用方法:1 将下载好的Ajax js文件引用到页面 代码如下:<script src " js MyAjax js" type &...
jquery中ajax方法有个属性async用于控制同步和异步,默认是true,即ajax请求默认是异步请求,有时项目中会用到AJAX同步。这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出现假死...
ajax 同步请求和异步请求的差异分析,需要的朋友可以参考下。
而在C++开发中,同步模式应该是主流,如果一定要使用异步模式加回调,可以参考Using IXMLHTTPRequest onreadystatechange from C++一文。 下面是采用异步模式获取远程主机上RSS文件的代码,关键的地方是设置一个回调...
javascript发送ajax请求,获取返回值res,async 同步/异步 var res = sendRequest({ url : "1.php", //necessary method : "post", params : { param1 : "123", param2 : "234" }, async : false });
最近的项目用了到AJAX同步。这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出去假死状态,当这个AJAX执行完毕后才会继续运行其他代码页面假死状态解除。 而异步则这个AJAX代码...
async在jquery ajax中是一个同步参数。本篇文章给大家介绍jq中的ajax async同步和异步,小伙伴跟着小编一起学习吧
主要是对Ajax同步与异步传输的示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
jquery ajax 同步异步的执行 return值不能取得的解决方案,需要的朋友可以参考下。
下面小编就为大家带来一篇浅谈js的ajax的异步和同步请求的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
本文为大家介绍下ajax同步异步的简单实现,感兴趣的朋友可以参考下
jquery中ajax方法有个属性async用于控制同步和异步,默认是true,即ajax请求默认是异步请求,有时项目中会用到AJAX同步。这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出现
extjs3.0 ajax 同步请求