JS引擎是單線程的,直白來說就是一個(gè)時(shí)間點(diǎn)下JS引擎只能去做一件事情,而java這種多線程語言可以同時(shí)做幾件事情。JS做的任務(wù)分為同步和異步兩種,所謂異步簡(jiǎn)單說就是一個(gè)任務(wù)不是連續(xù)完成的,先執(zhí)行第一段等做好了準(zhǔn)備再回過頭執(zhí)行第二段,第二段也被叫做回調(diào)。而同步則是連貫完成的。
成都創(chuàng)新互聯(lián)專注于濠江企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城網(wǎng)站建設(shè)。濠江網(wǎng)站建設(shè)公司,為濠江等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站建設(shè),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)像讀取文件、網(wǎng)絡(luò)請(qǐng)求這種任務(wù)屬于異步任務(wù),花費(fèi)時(shí)間很長(zhǎng)但中間的操作不需要JS引擎自己完成,他只用等別人準(zhǔn)備好了把數(shù)據(jù)給他他再繼續(xù)執(zhí)行回調(diào)部分。
異步任務(wù)的回調(diào)遵循先進(jìn)先出,在JS引擎空閑時(shí)會(huì)一輪一輪地被取出,所以被叫做循環(huán)。
常見的異步任務(wù):定時(shí)器,ajax,事件綁定,回調(diào)函數(shù),async await,promise
微任務(wù)和宏任務(wù)V8是瀏覽器的引擎,JS執(zhí)行時(shí)V8引擎會(huì)創(chuàng)建一個(gè)全局執(zhí)行上下文,在創(chuàng)建上下文的同時(shí),V8也會(huì)在內(nèi)部創(chuàng)建一個(gè)微任務(wù)隊(duì)列。有微任務(wù)隊(duì)列自然就有宏任務(wù)隊(duì)列,任務(wù)隊(duì)列中的每一個(gè)任務(wù)則都稱為宏任務(wù),在當(dāng)前宏任務(wù)執(zhí)行過程中如果有新的微任務(wù)產(chǎn)生就會(huì)添加到微任務(wù)隊(duì)列中。
宏任務(wù) | 微任務(wù) |
渲染事件 | Promise.[then/catch/finally] |
請(qǐng)求 | proxy代理 |
script代碼塊 | MutationObserver(監(jiān)聽DOM) |
setTimeout | node中的process.nextTick |
setinterval | queueMicrotask |
Node中的setimmediate | async/await |
I/O | ... |
... |
執(zhí)行順序描述:
首先走第一個(gè)宏任務(wù),第一個(gè)宏任務(wù)執(zhí)行結(jié)束后就會(huì)判斷現(xiàn)在微任務(wù)隊(duì)列里面有沒有可執(zhí)行的微任務(wù),如果有就執(zhí)行所有微任務(wù),會(huì)清空微任務(wù)隊(duì)列然后再開始新的宏任務(wù)。
宏任務(wù)是一個(gè)一個(gè)執(zhí)行的,但每執(zhí)行完一個(gè)宏任務(wù)都會(huì)把微任務(wù)清空,這樣就構(gòu)成了一個(gè)循環(huán),這個(gè)循環(huán)就叫做事件循環(huán)。Eventloop事件循環(huán)機(jī)制
事件循環(huán)由宏任務(wù)和在執(zhí)行宏任務(wù)期間產(chǎn)生的所有微任務(wù)組成。完成當(dāng)下的宏任務(wù)后會(huì)立刻執(zhí)行所有在此期間入隊(duì)的微任務(wù)。這種設(shè)計(jì)是為了給緊急任務(wù)一個(gè)插隊(duì)的機(jī)會(huì)否則新入隊(duì)的任務(wù)永遠(yuǎn)被放在隊(duì)尾。本輪循環(huán)中的微任務(wù)實(shí)際上就是在插隊(duì),這樣微任務(wù)中所做的狀態(tài)修改,在下一輪事件循環(huán)中也能得到同步。
微任務(wù)是ES6語法規(guī)定的,微任務(wù)的響應(yīng)速度比setTimeout會(huì)更快
宏任務(wù)是由瀏覽器規(guī)定的 ,宏任務(wù)可以理解是每次執(zhí)行棧執(zhí)行的代碼就是一個(gè)宏任務(wù)(包括每次從事件隊(duì)列中獲取一個(gè)事件回調(diào)并放到執(zhí)行棧中執(zhí)行)。事件的觸發(fā)是依賴于瀏覽器的實(shí)現(xiàn),平臺(tái)有他自己的事件注冊(cè)和派發(fā)機(jī)制,所以不管怎樣事件的獨(dú)立注冊(cè)表和派發(fā)機(jī)制導(dǎo)致他也不會(huì)和js存在一個(gè)進(jìn)程中,事件的管理中心一定是另外一個(gè)進(jìn)程中實(shí)現(xiàn)的,那么去派發(fā)事件,也就是宏任務(wù)。
規(guī)定的地方不一樣導(dǎo)致存放位置的不一樣所以才有了圖中存放位置的不同
【study】宏任務(wù)和微任務(wù)的區(qū)別是什么 - 掘金 (juejin.cn)
輸出結(jié)果1 5 6 8 4 7 2 3
Promise 是一個(gè)類,在執(zhí)行這個(gè)類的時(shí)候會(huì)傳入一個(gè)函數(shù),這個(gè)函數(shù)會(huì)立即執(zhí)行。
Promise 會(huì)有三種狀態(tài)
狀態(tài)只能由 Pending -->Fulfilled 或者 Pending -->Rejected,且一但發(fā)生改變便不可二次修改。
三個(gè)方法reject
、resolve
、then
。其中前兩個(gè)可以直接調(diào)用,也可以在回調(diào)中使用,說明是內(nèi)部方法也是靜態(tài)方法。then
可以鏈?zhǔn)秸{(diào)用,說明應(yīng)該是返回了一個(gè)新的Promise對(duì)象。
Promise 中使用 resolve 和 reject 兩個(gè)函數(shù)來更改狀態(tài)。
每次調(diào)用then
都創(chuàng)建了微任務(wù)。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前題目:Promise原理-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://jinyejixie.com/article16/jspgg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、電子商務(wù)、手機(jī)網(wǎng)站建設(shè)、ChatGPT、服務(wù)器托管、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容