什么是同步什么是异步
同步即是后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的
异步即是
每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。
最基本的异步操作
先了解 setTimeout 和 setInterval
console.log( "张一" );
setTimeout(function() {
console.log( "王三" )
}, 500 );
setTimeout(function() {
console.log( "李四" )
}, 500 );
setTimeout(function() {
console.log( "刘五" )
}, 500 );
console.log( "李二" );
输出结果为张一李二王二 李四刘五
意思是setTimeout函数 不会 排队执行 而是 改变执行顺序,
我们写的回调函数 就是以 setTimeout函数 为基础
回调函数
function A(callback) {
callback();
console.log('我是主函数');
}
function B(){
setTimeout("console.log('我是回调函数')", 3000);//模仿耗时操作
}
A(B);
我是主函数
我是回调函数
上面的代码中,我们先定义了主函数和回调函数,然后再去调用主函数,将回调函数传进去。
定义主函数的时候,我们让代码先去执行callback()回调函数,但输出结果却是后输出回调函数的内容。这就说明了主函数不用等待回调函数执行完,可以接着执行自己的代码。所以一般回调函数都用在耗时操作上面。比如ajax请求,比如处理文件等。
XmlHttpRequest对象发起请求,设置回调函数用来处理XHR的readystatechnage事件。然后执行XHR的send方法。在XHR运行中,当其属性readyState改变时readystatechange事件就会被触发,只有在XHR从远端服务器接收响应结束时回调函数才会触发执行。也就是如下:
xmlhttp.open( "GET", "url", true );
xmlhttp.onreadystatechange = function( data ) {
if ( xmlhttp.readyState === 4 ) {
console.log( data );
}
};
xmlhttp.send( null );