******AJAX中的同步和异步
>AJAX这个任务:发送请求接收到响应主体内容(完成一个完整的HTTP事务)
>xhr.send():任务开始
>xhr.readytate===4:任务结束
[同步编程]
let xhr=new XMLHttpRequest();
xhr.open('get','temp.json',false);
xhr.onreadystatechange=()=>{
console.log(xhr.readyState);
};
xhr.send();
//=>只输出一次结果是4
>由于采用的是同步编程,所以主任务队列没有完成(其它事情都做不了);
1->2 2->3 3->4 状态改变3次 xhr.readyState===4 AJAX任务完成,
主任务队列也执行完成,执行等待任务队列中的事情
此时的onreadystatechange只识别了从1->4,执行一次只输出的结果是4
.......
let xhr=new XMLHttpRequest();
xhr.open('get','temp.json',false);
xhr.send();//=>[同步]开始发送AJAX请求,开启AJAX任务,在任务没有完成之前,
什么事情都做不了(下面绑定事件也做不了)=>LOADING=>当readystate===4的时
候AJAX任务完成,开始执行下面的操作
//=>readystate===4
xhr.onreadystatechange=()=>{
console.log(xhr.readyState);
};
//=>绑定方法之前状态已经为4了,此时AJAX的状态不会再改变成其他值了,所以事件永远不会被触发,一次都没执行方法(使用AJAX同步编程,不要把send放在事件监听之前,这样我们无法在绑定的方法中获取到响应主体的内容)
[异步编程]
let xhr=new XMLHttpRequest();
xhr.open('get','temp.json');
xhr.onreadystatechange=()=>{
console.log(xhr.readyState);
};
xhr.send();
//=>异步编程;不需要等AJAX任务结束,此时等待任务队列就已经完成了
1->2:响应头信息返回了,状态改变会触发事件监听,把绑定的方法执行
2->3:绑定的方法再次执行
3->4:绑定的方法再次执行
AJAX任务也完成了
let xhr=new XMLHttpRequest();
xhr.open('get','temp.json',false);
xhr.send();
//=>xhr.readystate===1;
xhr.onreadystatechange=()=>{
console.log(xhr.readyState);
};
//=>1 2 3 4
***********
let xhr=new XMLHttpRequest();
xhr.onreadystatechange=()=>{
console.log(xhr.readyState);
};
xhr.open('get','temp.json',false);
//=>xhr.readystate===1 AJAX特殊处理的一件事:执行OPEN状态变为1,会主动把之前监听的方法执行一次,然后再去执行SEND
xhr.send();
//=>xhr.readystate===4 AJAX任务结束,主任务队列完成
//=>1,,4
**********
let xhr=new XMLHttpRequest();
xhr.onreadystatechange=()=>{
if(xhr.readystate===1){
xhr.setRequestHeader('aaa','bbb');
}
};
xhr.open('get','temp.json',false);
xhr.send();
//=>1,2,3,4
HTTP和AJAX(七、AJAX中的同步与异步)
最新推荐文章于 2024-05-21 10:41:09 发布