异步编程
概念
同步按代码顺序执行,异步不按照代码顺序执行,异步就是从主线程发射一个子线程来完成任务,执行效率更高。
我们常常用子线程来完成一些可能消耗时间足够长以至于被用户察觉的事情,比如读取一个大文件或者发出一个网络请求。
子线程局限:一旦发射了以后就会与主线程失去同步,我们无法确定它的结束,如果结束之后需要处理一些事情,比如处理来自服务器的信息,我们是无法将它合并到主线程中去的。
为了解决这个问题,JavaScript 中的异步操作函数往往通过回调函数来实现异步任务的结果处理。
回调函数
回调函数是一种以参数形式传递给另一个函数的函数。
异步任务的回调函数在异步任务结束后执行
示例:
function print() {
document.getElementById("demo").innerHTML="RUNOOB!";
}
setTimeout(print, 3000);
//以上可简写为:
setTimeout( ()=>{
document.getElementById("demo").innerHTML="hello!";
}, 3000)
这个函数执行之后会产生一个子线程,子线程会等待 3 秒,然后执行回调函数 “print”。在这3s期间,主线程不会停止,而是按顺序执行其他代码
异步 AJAX
除了 setTimeout 函数以外,异步回调广泛应用于 AJAX 编程。
var xhr = new XMLHttpRequest();
xhr.onload = function () {
// 输出接收到的文字数据
document.getElementById("demo").innerHTML = xhr.responseText;
}
xhr.onerror = function () {
document.getElementById("demo").innerHTML = "请求出错";
}
// 发送异步 GET 请求
xhr.open("GET", "http://152.136.148.31:7401/portal/gnvq/getCatList", true);
xhr.send();