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