JavaScript 同時只能執(zhí)行一個任務(wù),其他任務(wù)都必須在后面排隊等待。這就是我們常說的單線程袜漩。這也是JavaScript 的核心特征绪爸。
什么是異步任務(wù)?
異步任務(wù)是那些被引擎放在一邊宙攻,不進(jìn)入主線程奠货、而進(jìn)入任務(wù)隊列的任務(wù)。只有引擎認(rèn)為某個異步任務(wù)可以執(zhí)行了(比如 Ajax 操作從服務(wù)器得到了結(jié)果)座掘,該任務(wù)(采用回調(diào)函數(shù)的形式)才會進(jìn)入主線程執(zhí)行递惋。排在異步任務(wù)后面的代碼,不用等待異步任務(wù)結(jié)束會馬上運行溢陪,也就是說萍虽,異步任務(wù)不具有“堵塞”效應(yīng)。
舉例來說形真,Ajax 操作可以當(dāng)作同步任務(wù)處理杉编,也可以當(dāng)作異步任務(wù)處理,由開發(fā)者決定咆霜。如果是同步任務(wù)邓馒,主線程就等著 Ajax 操作返回結(jié)果,再往下執(zhí)行蛾坯;如果是異步任務(wù)光酣,主線程在發(fā)出 Ajax 請求以后,就直接往下執(zhí)行偿衰,等到 Ajax 操作有了結(jié)果挂疆,主線程再執(zhí)行對應(yīng)的回調(diào)函數(shù)。
JavaScript 運行時下翎,除了一個正在運行的主線程缤言,引擎還提供一個任務(wù)隊列(task queue),里面是各種需要當(dāng)前程序處理的異步任務(wù)视事。(實際上胆萧,根據(jù)異步任務(wù)的類型,存在多個任務(wù)隊列俐东。為了方便理解跌穗,這里假設(shè)只存在一個隊列。)
首先虏辫,主線程會去執(zhí)行所有的同步任務(wù)蚌吸。等到同步任務(wù)全部執(zhí)行完,就會去看任務(wù)隊列里面的異步任務(wù)砌庄。如果滿足條件羹唠,那么異步任務(wù)就重新進(jìn)入主線程開始執(zhí)行奕枢,這時它就變成同步任務(wù)了。等到執(zhí)行完佩微,下一個異步任務(wù)再進(jìn)入主線程開始執(zhí)行缝彬。一旦任務(wù)隊列清空,程序就結(jié)束執(zhí)行哺眯。
異步任務(wù)的寫法通常是回調(diào)函數(shù)谷浅。一旦異步任務(wù)重新進(jìn)入主線程,就會執(zhí)行對應(yīng)的回調(diào)函數(shù)奶卓。如果一個異步任務(wù)沒有回調(diào)函數(shù)一疯,就不會進(jìn)入任務(wù)隊列,也就是說寝杖,不會重新進(jìn)入主線程违施,因為沒有用回調(diào)函數(shù)指定下一步的操作。
// this.axios.post("/s/com.entgene.master.service.query/query", {
// msg: '北京'
// }).then(response => {
// console.log(responese);
// })