js是單執行緒,一次只能執行乙個任務,當有乙個耗時很長時,有乙個在後面等待,會造成堵塞,非同步的目的就是處理堵塞,提公升效能。
一、promise物件
promise呼叫內部函式。
promise有三種物件:
1.pending:待定,未初始化
2.resolved:非同步成功
3.rejected:非同步操作失敗
promise物件狀態改變:
1.從pending到resolved
2.從pending到rejected
引數 resolve和reject無論哪個值被呼叫,狀態都不可以撤銷,被呼叫後,then方法返回這個被呼叫的值。
console.log("你好");let a=new promise(function(resolve,reject),1000);
})settimeout(()=>,0)
console.log(45);
//輸出:你好 第乙個物件 45 再見 aha!
二、巨集任務和微任務
1.巨集任務
可以理解是每次執行棧執行的**就是乙個巨集任務(包括每次從事件佇列中獲取乙個事件**並放到執行棧中執行)。
(macro)task->渲染->(macro)task->...//完成第乙個巨集任務之後開始渲染,之後再執行下乙個任務
巨集任務包括:
script(整體**)settimeout
setinterval
i/oui互動事件
postmessage
messagechannel
setimmediate(node.js 環境)
2.微任務
當前 task 執行結束後立即執行的任務。也就是說,在當前task任務後,下乙個task之前,在渲染之前。
微任務包括:
promise.thenobject.observe
mutaionobserver
process.nexttick(node.js 環境)
過程:
console.log("1");new promise(function(resolve,reject)).then(function
());
settimeout(
function
()) console.log(5);
//輸出:1 2 5 3 4
事件迴圈 巨集任務 微任務
在js中我們經常會需要 同時 進行多項工作,例如 定時器 事件 非同步資料互動等,那麼js是如何管理這些任務的,又是如何確定他們的執行順序的?首先,所有的語言都擁有併發模型的概念,也就是說多個任務如何同時執行,大部分語言支援多執行緒執行,js擁有所有語言中最簡單的併發模型 js使用單執行緒的 事件迴...
js 事件迴圈 巨集任務 微任務
console.log 1 settimeout function then function new promise function resolve then function settimeout function then function 先分析 的執行步驟 1 從上向下執行 consol...
微任務,巨集任務,事件迴圈(Event Loop)
最近遇到了事件迴圈的問題,於是決定好好的研究一番。看了一篇文章感覺講的特別好。我們都知道event loop的執行順序是 執行巨集任務 該巨集任務產生的微任務,若微任務執行中產生了新的微任務,則繼續執行微任務,微任務執行完畢,再回到巨集任務進行下一輪迴圈。後來自己也看了很多例子,但是疑惑點是,對於p...