jquery的promise和es6的promise的區別
大概意思是:瀏覽器中的任務佇列不止一個,且優先順序也不同。基本上可以分為如下兩種:
macro-task: script(整體程式碼), setTimeout, setInterval, setImmediate, I/O, UI rendering
micro-task: process.nextTick, 原生Promise, Object.observe, MutationObserver
我們看到原生Promise和setTimeout分別屬於micro-task和macro-task。我們之前說的非同步任務佇列,指的是macro-task。而micro-task的執行順序,與之不同。
在執行完主執行緒上的所有任務時,會先去檢視micro-task
https://segmentfault.com/q/1010000008612124
我們都知道javascript
是單執行緒的,也就是說,一個時間只能做一件事。所以,所有的任務都要按照一定的順序排隊,然後一個一個執行。如果所有的任務都是同步的,那就沒有什麼問題,程式碼按照從前到後的順序依次執行就可以了,但我們實際工作過程中,難免會有一些操作需要非同步執行——比如事件,比如ajax,比如setTimeout
所以,瀏覽器會維護一個任務佇列(task queue
),任務佇列是先進先出的,也就是說,先進入任務佇列的會先執行。當主執行緒任務執行完畢,就會檢視任務佇列中有沒有新任務,如果有,則把第一個任務放到主執行緒中執行,以此迴圈往復,這個過程也就是Event loops
。
我之前也一直都以為瀏覽器中只有一個任務佇列,看到這個問題後才知道。原來瀏覽器中的任務佇列不止一個,且優先順序也不同。基本上可以分為如下兩種:
macro-task
: script(整體程式碼), setTimeout, setInterval, setImmediate, I/O, UI renderingmicro-task
: process.nextTick, 原生Promise, Object.observe, MutationObserver
我們看到原生Promise
和setTimeout
分別屬於micro-task
和macro-task
。我們之前說的非同步任務佇列,指的是macro-task
。而micro-task
的執行順序,與之不同。
在執行完主執行緒上的所有任務時,會先去檢視micro-task
佇列中有沒有任務,如果有,則依次執行micro-task
佇列中的所有任務,之後才去檢視macro-task
佇列。每次拿到macro-task
佇列上任務並執行之後,都會去檢查micro-task
佇列,以此迴圈。所以上面題目中結果是12354
就很明瞭了。
2017-05-20 21:24