Javascript語言的執行環境是“單線程”,Javascript語言將任務的執行模式分成兩種:同步和異步。
- “同步模式”就是上一段的模式,后一個任務等待前一個任務結束,然后再執行,程序的執行順序與任務的排列順序是一致的、同步的;
- "異步模式"則完全不同,程序的執行順序與任務的排列順序是不一致的、異步的。
- "異步模式"非常重要。在瀏覽器端,耗時很長的操作都應該異步執行,避免瀏覽器失去響應,最好的例子就是Ajax操作。
下面看阮一峰的異步編程的四種方法:
一、回調函數
把函數作為參數傳入到另一個函數中。這個函數就是所謂的回調函數。
假設有兩個函數,f1很耗時,在同步模式下,f2只能等f1執行完畢后再執行
function f1(){console.log(1)}
function f2(){console.log(2)}
f1()
f2()
//1
//2
如果我們希望f2在f1執行結束后立刻執行
function f2(){console.log(2)}
function f1(callback) {
console.log(1)
callback()
}
f1(f2)
//1
//2
setTimeout()函數支持異步處理,如果我們希望f1延遲執行
function f2(){console.log(2)}
function f1(callback){
setTimeout(function() {console.log(1)}, 1000)
callback()
}
f1(f2)
//2
//1
二、事件監聽
異步任務的執行不取決于代碼的順序,而取決于某個事件是否發生。
三、發布/訂閱
我們假定,存在一個"信號中心",某個任務執行完成,就向信號中心"發布"(publish)一個信號,其他任務可以向信號中心"訂閱"(subscribe)這個信號,從而知道什么時候自己可以開始執行。
四、promise
看promise
另外,ES2017 標準引入了 async 函數,使得異步操作變得更加方便。