1. 程式人生 > 實用技巧 >jquery的promise和es6的promise的區別

jquery的promise和es6的promise的區別

大概意思是:瀏覽器中的任務佇列不止一個,且優先順序也不同。基本上可以分為如下兩種:
macro-task: script(整體程式碼), setTimeout, setInterval, setImmediate, I/O, UI rendering
micro-task: process.nextTick, 原生Promise, Object.observe, MutationObserver
我們看到原生PromisesetTimeout分別屬於micro-taskmacro-task。我們之前說的非同步任務佇列,指的是macro-task。而micro-task的執行順序,與之不同。

在執行完主執行緒上的所有任務時,會先去檢視micro-task

佇列中有沒有任務,如果有,則依次執行micro-task佇列中的所有任務,之後才去檢視macro-task佇列。每次拿到macro-task佇列上任務並執行之後,都會去檢查micro-task佇列,以此迴圈。

https://segmentfault.com/q/1010000008612124

我們都知道javascript是單執行緒的,也就是說,一個時間只能做一件事。所以,所有的任務都要按照一定的順序排隊,然後一個一個執行。如果所有的任務都是同步的,那就沒有什麼問題,程式碼按照從前到後的順序依次執行就可以了,但我們實際工作過程中,難免會有一些操作需要非同步執行——比如事件,比如ajax,比如setTimeout

所以,瀏覽器會維護一個任務佇列(task queue),任務佇列是先進先出的,也就是說,先進入任務佇列的會先執行。當主執行緒任務執行完畢,就會檢視任務佇列中有沒有新任務,如果有,則把第一個任務放到主執行緒中執行,以此迴圈往復,這個過程也就是Event loops

我之前也一直都以為瀏覽器中只有一個任務佇列,看到這個問題後才知道。原來瀏覽器中的任務佇列不止一個,且優先順序也不同。基本上可以分為如下兩種:

macro-task: script(整體程式碼), setTimeout, setInterval, setImmediate, I/O, UI rendering
micro-task: process.nextTick, 原生Promise, Object.observe, MutationObserver

我們看到原生PromisesetTimeout分別屬於micro-taskmacro-task。我們之前說的非同步任務佇列,指的是macro-task。而micro-task的執行順序,與之不同。

在執行完主執行緒上的所有任務時,會先去檢視micro-task佇列中有沒有任務,如果有,則依次執行micro-task佇列中的所有任務,之後才去檢視macro-task佇列。每次拿到macro-task佇列上任務並執行之後,都會去檢查micro-task佇列,以此迴圈。所以上面題目中結果是12354就很明瞭了。

2017-05-20 21:24