【js】事件循環之promise的async/await與setTimeout

什么是事件循環

事件循環又叫消息循環,是瀏覽器渲染主線程的工作方式。

瀏覽器開啟一個永不停止的for循環,每次循環都會從消息隊列中取任務,其他線程只需要在合適的時候將任務加入到消息隊列的末尾。

過去分為宏任務和微任務,現在由于瀏覽器環境越來越復雜,宏任務的說法已經不合適,取而代之的是w3c官網新提出的,每個任務都會帶有任務類型,同類型的任務放在同對列,不同的任務可以放在不同的對列,不同的對列有不同的優先級,(任務沒有優先級)由瀏覽器自行決定優先執行哪一個,但是總會有一個微隊列,優先級最高

在這里插入圖片描述

什么是async與await

async/await是JavaScript中處理異步操作的一種方式,它是基于Promise的語法糖。

async關鍵字用于聲明一個函數是異步的,而await關鍵字用于等待一個Promise解析完成。

此時可以認為,在await之后的代碼其實是promise完成之后才執行,也就是說相當于promise.then回調執行的的內容,只是通過async / await語法糖解決了promise的回調嵌套問題

事件循環中的同步任務與異步任務

眾所周知,同步任務即按順序執行,異步任務即開啟新線程與主線程并行執行

常見的異步任務有 promise、setTimeout、nextTick等,而這些在之前又分為宏任務和微任務,但其實現在官方更改了宏任務的說法,提出分類型的任務隊列(后面統稱為其他異步隊列)和微隊列,微隊列的優先級高于其他異步隊列。promise.then和nextTick屬于微任務,會進入微隊列
在這里插入圖片描述

在事件循環過程中,按順序處理當前消息隊列中的任務; 當遇到await關鍵字時,JavaScript會將該異步函數暫停(也就是指暫停當前 async function 內部await之后的代碼執行)

其實此時await后面的代碼產生一個微任務,進入微隊列,瀏覽器主線程將其放入微隊列后將繼續執行消息隊列中的任務,直到消息隊列中的任務全部執行完成之后,微隊列的任務才會進入到消息隊列去執行

需要注意的是,雖然await會暫停代碼執行,但它不會阻塞事件循環。這意味著其他任務(已在消息隊列中的后面的任務)可以在等待Promise解析期間繼續執行。

案例

async function async1 () {console.log(1)await async2()console.log(2)
}async function async2 () {console.log(3)
}console.log(4)setTimeout(function () {console.log(5)
}, 0)async1()new Promise(function (resolve) {console.log(6)resolve()
}).then(function () {console.log(7)
})console.log(8)// 4 1 3 6 8 2 7 5

解析

首先解析這些js代碼,將任務按照代碼執行順序放入消息隊列,初始隊列如下圖
在這里插入圖片描述

開始執行之后

1、首先控制臺輸出4
2、其次執行setTimeout,為異步任務,并且不是微任務,放入其他異步隊列,交給其他線程進行處理
3、執行到async1(),進入async1()函數內部執行

async function async1 () {console.log(1)await async2()console.log(2)
}

進入async1()函數內部開始執行

1、控制臺輸出1
2、進入async2()執行并等待,也就是將await async2()后面的內容console.log(2)放入微隊列等待promise解析完成后放入消息隊列。而async2()內部只有console.log(3),是同步任務,立即執行,控制臺輸出3。此時的消息隊列圖如下
在這里插入圖片描述

繼續執行,進入new Promise()

1、控制臺輸出6
2、.then()放入微隊列
3、繼續執行控制臺輸出8,此時的消息隊列圖如下

在這里插入圖片描述

消息隊列清空后,微隊列的任務進入消息隊列,繼續執行

1、控制臺輸出2
2、執行then函數,輸出7
3、微隊列任務清空,其他異步隊列任務進入消息隊列開始執行
在這里插入圖片描述

控制臺輸出5,至此所有任務執行完畢,控制臺輸出 4 1 3 6 8 2 7 5
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/718904.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718904.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718904.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

wordpress模板官網

移民wordpress主題 移民代辦wordpress主題,適合做海外移民咨詢的代理公司搭建wordpress企業官方網站使用。 https://www.jianzhanpress.com/?p5130 夏令營wordpress主題 綠色夏令營wordpress主題,適合做夏令營或戶外拓展的公司搭建wordpress官方網站…

D2587A高壓大電流DC-DC——專為反激式、升壓和正向轉換器應用而設計的單片集成電路

1、概述 D2587A穩壓器是專為反激式、升壓和正向轉換器應用而設計的單片集成電路。該器件提供四種不同的輸出電壓版本:3.3V、5V、12V 和可調節電壓。這些穩壓器需要的外部元器件很少,因此具有成本效益,并且易于使用。該電源開關是一款5A NPN器…

面試經典150題——最小棧

?Life is a journey, theres no right or wrong. 1. 題目描述 2. 題目分析與解析 2.1 思路一 看到題目的一瞬間,有沒有注意到 常數時間內檢索到最小元素的棧,那說明我們肯定需要把最小元素的下標存儲起來,這樣才能在常數時間內找到。 其…

網工學習 DHCP配置-接口模式

網工學習 DHCP配置-接口模式 學習DHCP總是看到,接口模式、全局模式、中繼模式。理解起來也不困難,但是自己動手操作起來全是問號。跟著老師視頻配置啥問題沒有,自己組建網絡環境配置就是不通,悲催。今天總結一下我學習接口模式的…

c++動態獲取工作路徑

最近在寫項目時遇到一個問題 pclrobot:~/cProject/projects/myPro/mpRPC$ ls autobuild.sh bin build CMakeLists.txt conf example lib log README.md src test如上所示,我的項目根目錄里有一個log文件夾和一個bin文件夾,我的需求是 bin目錄…

揭秘8.4k星開發者的秘密武器:it-tools在線工具集,你不可不知!

在IT的世界里,為了更好地發揮自己的才能,必須善用優秀的工具。深入挖掘IT-Tools的神奇力量,讓你的工作像魔法一般變得輕松高效!無論是自動化、監控還是問題解決,這些工具是我們事業成功的關鍵利器。選擇合適的IT工具&a…

PlantUML - 時序圖

時序圖主要內容 下面是一個簡單的時序圖,我們可以很容易并且美觀的表達我們的交互流程,只需要在箭頭的兩邊指定一個名字,加上描述即可: startuml bkloanapply -> bkloanapprove : request bkloanapprove --> bkloanapply :…

C++ map用法

int main() {void *p;str *st;st (str*)malloc(sizeof(str));st->a 23;st->b 24;p st;//使用void指針需強制類型轉換printf("%d\n%d\n",((str*)p)->a, ((str*)p)->b);free(st);map<char, int> mpci;mpci[m] 20;mpci.insert(pair<char, int…

#WEB前端(盒子模型)

1.實驗&#xff1a;盒子 2.IDE&#xff1a;VSCODE 3.記錄&#xff1a; margin&#xff08;外邊距&#xff09; border&#xff08;邊框&#xff09; padding&#xff08;內邊距&#xff09; 4.代碼&#xff1a; <!DOCTYPE html> <html lang"en"> &…

【C++】類與對象(static、explicit、友元、隱式類型轉換、內部類、匿名對象)

&#x1f308;個人主頁&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列專欄&#xff1a;http://t.csdnimg.cn/eCa5z 目錄 再談構造函數 初始化列表 隱式類型轉換 explicit關鍵字 static成員 概念 計算程序中創建出了多少個類…

開源軟件的商業模式探析:開放與盈利的平衡

寫在開頭 開源軟件的概念和應用已經成為了現代科技領域中的一個重要組成部分。然而&#xff0c;雖然開源軟件的價值和影響力得到了廣泛認可&#xff0c;但如何在開放的環境中找到商業盈利的平衡卻是一個頗具挑戰性的問題。本文將深入探討開源軟件的商業模式&#xff0c;從基本…

力扣61:旋轉鏈表

題目 給你一個鏈表的頭節點 head &#xff0c;旋轉鏈表&#xff0c;將鏈表每個節點向右移動 k 個位置。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,3,4,5], k 2輸出&#xff1a;[4,5,1,2,3] 示例 2&#xff1a; 輸入&#xff1a;head [0,1,2], k 4輸出&#xff1a;…

卷積神經網絡(CNN)原理與實現

卷積神經網絡(CNN) 卷積神經網絡原理卷積神經網絡的數學推導卷積層反向傳播算法數學推導卷積層實現代碼 卷積神經網絡(CNN) 卷積神經網絡原理 卷積神經網絡是一種用于圖像、語音、自然語言等數據的深度學習模型&#xff0c;其核心思想是使用卷積操作提取輸入數據的特征&…

4、通達OA代碼審計

一、文件操作 1、文件上傳配合文件包含審計 文件上傳首先確定存在漏洞的文件。和文件上傳相關的函數比如upload。在從上到下分析構造的條件1. 從 POST 請求中提取變量 P 的值。 2. 檢查 P 是否已設置且不為空字符串。 3. 如果 P 已設置且非空&#xff0c;進入包含 "inc/…

JavaScript定義函數,創建函數實例時的內部原理

1、定義一個函數&#xff0c;JavaScript內部各做了哪些事情 定義一個函數時&#xff0c;JavaScript內部執行了以下步驟&#xff1a; 解析函數聲明: 當你定義一個函數時&#xff0c;JavaScript的解析器會首先解析函數聲明。這意味著它會檢查函數聲明的語法是否正確&#xff0c;…

[NSSCTF 2nd]MyJs

做一題ejs原型鏈污染 首先是登錄界面 源碼里面提示了源碼的路由 js不熟先審計一下 const express require(express); #導入Express框架&#xff0c;用于構建Web應用程序的服務器和路由 const bodyParser require(body-parser); #導入body-parser中間件&#xff0c;用于解析…

軟考證書=職稱證書?

官方的回答 根據《計算機技術與軟件專業技術資格&#xff08;水平&#xff09;考試暫行規定》&#xff08;國人部發〔2003〕39號&#xff09;規定&#xff0c;通過考試并獲得相應級別計算機專業技術資格&#xff08;水平&#xff09;證書的人員&#xff0c;表明其已具備從事相…

學習Android的第二十二天

目錄 Android ContextMenu 上下文菜單 ContextMenu 范例 參考文檔 Android SubMenu 子菜單 范例 參考文檔 Android PopupMenu 彈出菜單 范例 參考文檔 Android ContextMenu 上下文菜單 在Android開發中&#xff0c;ContextMenu&#xff08;上下文菜單&#xff09;為…

使用Javassist 在android運行時生成類

序言 最近在寫框架&#xff0c;有一個需求就是動態的生成一個類&#xff0c;然后查閱了相關文獻&#xff0c;發現在android中動態生成一個類還挺麻煩。因次把一些內容分享出來&#xff0c;幫助大家少走彎路。 方案一 DexMaker DexMaker 是一個針對 Android 平臺的庫&#xf…

Myqsort:基于冒泡排序算法的C語言實現

我們將詳細介紹一個基于冒泡排序算法的自定義排序函數——Mysqrt。該函數通過使用用戶提供的比較函數進行元素間的比較&#xff0c;并結合swap交換函數對任意類型的數據進行排序。下面是對代碼的逐行解析。 邏輯導圖 代碼實現 // 頭文件 #include<stdio.h>// 定義比較函…