up:: 一个ajax比较拟真的范例
本篇博客,先讲述同步和异步的区别,然后分别演示了同步和异步的基本范例程序;在这个过程中可以体味同步和异步的区别,以便按需选用;;;具体同步和异步的深入理解,需要在实际应用中逐渐深化!
平常在浏览网页的时候,当打开一个新的网页时,经常遇到整个网页的基本架构(如页眉、页脚、网页顶部描述性文字、网页底部描述性文字等)已经加载出来了,但网页中间某些数据、图片等核心区块需要等一段时间后才会出来,这其中就大概率使用到了ajax异步处理的方式;(maybe);
零:ajax同步和异步的简述
在ajax的第二步,发送ajax请求的时候,第三个参数,true:异步;false:同步;
// 2.发送Ajax请求
xmlhttp.open("GET","/ajax/news_list",true);
xmlhttp.send();
什么是异步,什么是同步?
分析:xmlhttp.send();在发送请求的过程中是需要时间的,网络传输将请求发送到服务器,服务器处理再返回响应的过程肯定是需要一些时间的;
true异步:在上面发送的过程中,程序的其他部分继续向下执行;
false同步:在上面发送的过程中,程序的其他部分不继续向下执行,而是等到响应成功后再继续执行;
一:示例1:如果设置成false同步时:
在实际中,后台服务器响应需要一定的时间,为了使效果明显,方便肉眼观察,模拟后台实际消耗的时间,这儿休眠5秒钟:
效果:发现,等后台响应后,控制台输出了预设内容;但是,在浏览器界面没有显示出响应的结果,而是显示了一个白板;
so,一:为什么程序处于一直等待的状态;等待了差不多5秒后,才执行console.log(“请求发送完成”);?????
二:为什么浏览器界面没有显示出响应的内容?
如果想在同步的情况下,继续在浏览器界面显示响应内容: 将xmlhttp.onreadystatechange = function(){}里面的内容复制带send()后面:即也就是说,同步的时候:xmlhttp.onreadystatechange = function(){}这个就会不起作用了;
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div id="container"></div>
<script>
// 1.创建XmlHttpRequest对象
var xmlhttp;
if(window.XMLHttpRequest){
xmlhttp = new XMLHttpRequest();
}else{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
// 2.发送Ajax请求
xmlhttp.open("GET","/ajax/news_list",false);
xmlhttp.send();
console.log("请求发送完成");
if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
var t = xmlhttp.responseText; // 从后台拿过来的数据:这个JSON是个JSON字符串
var jsont = JSON.parse(t); // 需要将JSON字符串转成JSON对象;JavaScript可以认为内置了JSON对象
console.log(t);
console.log(jsont);
var html = "";
for(var i = 0;i< jsont.length;i++){
var news = jsont[i];
html = html+"<h1>"+news.title+"</h1>";
html = html + "<h2>"+news.date+" "+news.source+" "+news.content + "</h2>";
html = html + "<hr/>";
}
document.getElementById("container").innerHTML = html;
}
// 3.处理服务器响应
/*xmlhttp.onreadystatechange = function(){
if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
var t = xmlhttp.responseText; // 从后台拿过来的数据:这个JSON是个JSON字符串
var jsont = JSON.parse(t); // 需要将JSON字符串转成JSON对象;JavaScript可以认为内置了JSON对象
console.log(t);
console.log(jsont);
var html = "";
for(var i = 0;i< jsont.length;i++){
var news = jsont[i];
html = html+"<h1>"+news.title+"</h1>";
html = html + "<h2>"+news.date+" "+news.source+" "+news.content + "</h2>";
html = html + "<hr/>";
}
document.getElementById("container").innerHTML = html;
}
}*/
</script>
</body>
</html>
效果:
二:示例2:设置成true异步时:(核心部分)
异步:在网络发送请求过程中控不进行代码阻塞,继续向下执行,异步采用onreadystatechange进行对响应状态的监控,程序的其他部分该执行还执行;
设置成异步的时候:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div id="container"></div>
<script>
// 1.创建XmlHttpRequest对象
var xmlhttp;
if(window.XMLHttpRequest){
xmlhttp = new XMLHttpRequest();
}else{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
// 2.发送Ajax请求
xmlhttp.open("GET","/ajax/news_list",true);
xmlhttp.send();
console.log("请求发送完成");
/*if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
var t = xmlhttp.responseText; // 从后台拿过来的数据:这个JSON是个JSON字符串
var jsont = JSON.parse(t); // 需要将JSON字符串转成JSON对象;JavaScript可以认为内置了JSON对象
console.log(t);
console.log(jsont);
var html = "";
for(var i = 0;i< jsont.length;i++){
var news = jsont[i];
html = html+"<h1>"+news.title+"</h1>";
html = html + "<h2>"+news.date+" "+news.source+" "+news.content + "</h2>";
html = html + "<hr/>";
}
document.getElementById("container").innerHTML = html;
}*/
// 3.处理服务器响应
xmlhttp.onreadystatechange = function(){
if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
var t = xmlhttp.responseText; // 从后台拿过来的数据:这个JSON是个JSON字符串
var jsont = JSON.parse(t); // 需要将JSON字符串转成JSON对象;JavaScript可以认为内置了JSON对象
console.log(t);
console.log(jsont);
var html = "";
for(var i = 0;i< jsont.length;i++){
var news = jsont[i];
html = html+"<h1>"+news.title+"</h1>";
html = html + "<h2>"+news.date+" "+news.source+" "+news.content + "</h2>";
html = html + "<hr/>";
}
document.getElementById("container").innerHTML = html;
}
}
</script>
</body>
</html>
效果:可以看到,刷新界面后,控制台立即打印出了“请求发送成功”,然后等待后台响应;
临加一个小例子:
效果:“请求发送完成”和“哈哈哈”都立即显示; 说明:当设置成异步后,请求发送后、响应回来前,程序会继续执行,只是通过xmlhttp.onreadystatechange = function(){}来实时监控响应的状态,程序其他的部分该执行执;能懂这个过程???ok ,
注解:
(1)ajax绝大部分情况下使用异步方式处理; 但说不定某些场景适合使用同步的方式;
(2)同步是发送一个请求,需要等待返回,然后才能够发送下一个请求;异步是发送一个请求,不需要等待返回,随时可以再发送下一个请求;同步有个等待的过程;
(3)同步和异步的深入理解必须通过在实际应用中逐渐深化理解,到时再总结~~~