什么是同步什么是異步
同步即是后一個任務等待前一個任務結束,然后再執行,程序的執行順序與任務的排列順序是一致的、同步的
異步即是
每一個任務有一個或多個回調函數(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 );