不少開發者都說JavaScript是單線程的,可是單線程是如何實現異步的呢?然而並無詳細說過,其實JavaScript還有一條或者多條線程用來實現異步操做,也就是異步隊列。javascript
舉個例子:html
馬路上有不少車,一輛接一輛的排着跑,忽然排在最前面的車壞了,java
這時候你是讓後面的全部的車都等它修好在一塊兒跑嗎?node
然而是不可能的,那樣交通就亂掉了。python
這時候就出現了應急車道,把壞的車挪到應急車道上去,web
後面的車繼續跑,等壞的車修好了,在挪到車道上去正常跑。面試
這就是JavaScript中的異步執行隊列。express
什麼是同步什麼是異步呢?編程
同步api
簡而言之,同步就是從上往下依次執行,就像java,c,python等強類型的語言。都是順時同步執行,不多有異步操做。
而同步就要求開發者的編碼要嚴謹,若是有疏忽,就會致使運行出錯,運行卡頓,致使用戶體驗差等,
舉個簡單的例子說明什麼是同步執行
這就是同步執行, f1() 在f2()的上面因此先執行 f1() 在執行f2() 簡單說就是一個先進先出的隊列。後者必須等待前者的結果出來纔會運行
那麼若是我不想讓f2等着f1執行完在執行,我就想讓他正常執行呢? 那你就用異步函數編程就行 我推薦你們看一下阮一峯老師的異步函數式編程(http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html
),固然面試的時候不推薦拿出來吹牛逼。
異步
那麼就把f2當成f1的參數,把f2寫成f1的回調函數,這樣f2不用再等待f1是否執行完成,只要過了1s就會執行f2函數
function f1 (callback) {
setTimeOut (() => {
callBack()
}, 1000)
}
f1(f2)
阻塞
什麼是阻塞?
阻塞與非阻塞其實跟同步與異步並無什麼直接關係。要正確理解。不要說阻塞=同步,非阻塞=異步
最多見的阻塞現象,例如 死循環, 用戶體驗差, 運行卡頓等。引發阻塞的緣由,就是一個api或者函數運行時,獨佔cpu致使其餘代碼沒法運行。
爲何你們會把阻塞與同步聯繫在一塊兒了?
開發者都知道同步代碼從上至下依次運行,當運行遭遇阻塞,後面的代碼天然而然不會運行。
非阻塞呢?
一說到非阻塞你們應該會想到 node, 由於nodejs最大的優勢就是他的 異步非阻塞IO,node中大部分都是異步的,包括基於node開發的express,koa等框架。
node進程中,一個用戶線程(js單線程),一個異步線程池(用戶沒法直接訪問到),對於真正的阻塞代碼,好比異步中發生阻塞,若是跑在異步中的仍然是阻塞代碼,那麼這種異步根本起步到解決阻塞的做用,由於阻塞代碼會獨佔cpu,多以致使本進程上面的全部代碼都要等待,無論是哪一個線程,可是node的IO是不會霸佔cpu的,因此node最出色的就是他的異步非阻塞IO。真正碰到阻塞代碼,node也只能開多線程多服務來解決了,由於每一門語言必然有他的優勢與缺點,node自己就是爲了讓開發者更好的開發web後臺服務的。
同步異步,阻塞與非阻塞就說到這裏了。