第127篇:非同步函數(async和await)練習題(非同步,消息隊列)

来源:https://www.cnblogs.com/FatTiger4399/archive/2023/03/09/17198569.html
-Advertisement-
Play Games

好家伙,本篇為做題思考 書接上文 題目如下: 1.請給出下列代碼的輸出結果,並配合"消息隊列"寫出相關解釋 async function foo() { console.log(2); console.log(await Promise.resolve(8)); console.log(9); } ...


好家伙,本篇為做題思考

書接上文

 

題目如下:

 1.請給出下列代碼的輸出結果,並配合"消息隊列"寫出相關解釋

async function foo() {
    console.log(2);
    console.log(await Promise.resolve(8));
    console.log(9);
}
async function bar() {

    console.log(4);
    console.log(await 6);
    console.log(7);
}
console.log(1);
foo();
console.log(3);
bar();
console.log(5);

 

好我們公佈答案:

 

(1) 列印 1;

(2) 調用非同步函數 foo();

(3)(在 foo()中)列印 2;

(4)(在 foo()中)await 關鍵字暫停執行,向消息隊列中添加一個期約在落定之後執行的任務;

(5) 期約立即落定,把給 await 提供值的任務添加到消息隊列;

(6) foo()退出;

(7) 列印 3;

(8) 調用非同步函數 bar();

(9)(在 bar()中)列印 4;

(10)(在 bar()中)await 關鍵字暫停執行,為立即可用的值 6 向消息隊列中添加一個任務;

(11) bar()退出;

(12) 列印 5;

(13) 頂級線程執行完畢;

(14) JavaScript 運行時從消息隊列中取出解決 await 期約的處理程式,並將解決的值 8 提供給它;

(15) JavaScript 運行時向消息隊列中添加一個恢復執行 foo()函數的任務;

(16) JavaScript 運行時從消息隊列中取出恢復執行 bar()的任務及值 6;

(17)(在 bar()中)恢復執行,await 取得值 6;

(18)(在 bar()中)列印 6;

(19)(在 bar()中)列印 7;

(20) bar()返回;

(21) 非同步任務完成,JavaScript 從消息隊列中取出恢復執行 foo()的任務及值 8;

(22)(在 foo()中)列印 8;

(23)(在 foo()中)列印 9;

(24) foo()返回。

 

所以答案是

1

2

3

4

5

6

7

8

9

 

好了,結束了,沒什麼問題了

步驟也解釋清楚了

 

但是我隱約感到了不對勁

怎麼會是123456789呢?

foo()應該是先恢復的,但是這裡明顯bar()先恢復了

 

 

我們上機試一下

 

 

 

 

誒,結果不對

前面地12345都沒有問題,6789的輸出變成了8967

我們主要來看和6789有關的輸出欄位

 

我們再來仔細地看看前面地解釋,並把關鍵解釋划出來

(4)(在 foo()中)await 關鍵字暫停執行,向消息隊列中添加一個期約在落定之後執行的任務;

(5) 期約立即落定,把給 await 提供值的任務添加到消息隊列;

(6) foo()退出;

 

(10)(在 bar()中)await 關鍵字暫停執行,為立即可用的值 6 向消息隊列中添加一個任務;

(11) bar()退出;

 

(13) 頂級線程執行完畢;

(14) JavaScript 運行時從消息隊列中取出解決 await 期約的處理程式,並將解決的值 8 提供給它;

(15) JavaScript 運行時向消息隊列中添加一個恢復執行 foo()函數的任務;

(16) JavaScript 運行時從消息隊列中取出恢復執行 bar()的任務及值 6;

 

我們回顧一下消息隊列

一個 JavaScript 運行時包含了一個待處理消息的消息隊列。. 每一個消息都關聯著一個用以處理這個消息的回調函數。

再補充一個關於await的知識點

等到 await 右邊的值可用了,JavaScript 運行時會向消息 隊列中推送一個任務,這個任務會恢復非同步函數的執行。

 

我們試著把這個消息隊列畫出來

 

(有點抽象,但應該能看懂)

這樣,我們就會發現, 因為Promise.resolve(8)被多處理了一次,導致了foo()方法後恢復

所以bar()先恢復了

 

那麼實際上機又是怎麼回事呢?

(書裡面有行小字被我忽略了,後面又找到了)

 

 TC39 對 await 後面是期約的情況如何處理做過一次修改。修改後,本例中的 Promise.resolve(8)只會生成一個 非同步任務。

因此在新版瀏覽器中,這個示例的輸出結果為 123458967。實際開發中,對於並行的非同步操作我們通常 更關註結果,而不依賴執行順序。——譯者註

 

 

實際上機的消息隊列

 

原先的兩步處理變成了一步

搞定了,原來如此

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 更好地提高效率一直以來是袋鼠雲數棧產品的主要目標之一。當前數棧客戶的實時任務都是基於 Per-Job 模式運行的,客戶在進行一些任務參數的修改之後,只能先取消當前任務,再選擇 CheckPoint 恢復或者重新運行,整個過程需要3-5分鐘,比較浪費時間。為了達到提高效率的目的,我們針對 Per-Jo ...
  • 摘要:本文簡單介紹sequence的使用場景及如何修改sequence的cache值提高性能。 本文分享自華為雲社區《GaussDB(DWS)關於sequence的那些事》,作者:Arrow0lf 。 什麼是sequence sequence,也稱作序列,是用來產生唯一整數的資料庫對象。序列的值按照 ...
  • 導讀 本文將介紹網易數帆在數據治理方面的一些總結和思考。文章將圍繞以下三點展開: 1. 數據治理解決了什麼問題 2. 數據治理體系 3. 淺談數據治理的實現 01數據治理解決了什麼問題 首先看一下數據治理解決了什麼問題,可以總結為六個方面: 1. 數據開發與數據治理脫節 在許多企業中存在這樣一個現象 ...
  • 1 mysql邏輯架構 mysql邏輯架構圖: Mysql伺服器、存儲引擎 是兩個獨立的組件,彼此通過api交互 第一層:連接處理、授權認證、安全管理 第二層:核心服務功能 查詢解析、分析、優化、緩存以及所有的內置函數(日期、時間、數學、加密函數等) 跨存儲引擎的功能:存儲過程、觸發器、視圖等。 第 ...
  • 數據治理是推動大型集團企業轉型升級、提升競爭優勢、實現高質量發展的重要引擎。通過全鏈數據結構化,實現業務對象、業務規則、業務流程數字化,推進全鏈業務深度數字化,夯實數據運營底座。 廈門國貿集團股份有限公司(簡稱“國貿股份”)是國有控股上市公司,同時也是首批全國供應鏈創新與應用示範企業,在“十四五”規 ...
  • 摘要:其實游戲客戶對資料庫的訴求是很明確的,資料庫應當“放心存放心用”。 本文分享自華為雲社區《華為雲GaussDB(for Redis)揭秘第27期:聊聊游戲業務怎麼用高斯Redis》,作者:高斯Redis官方博客。 華為雲資料庫團隊是比較重視技術洞察的,對客戶真實的業務場景也比較看重。年初出差了 ...
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者: 花家舍 文章來源:GreatSQL社區原創 前文回顧 實現一個簡單的Database系列 譯註:cstack在github維護了一個簡單的、類似 ...
  • 生活中存在同時使用兩個微信的情況,一個工作一個生活,這時希望同時在電腦上登錄兩個賬號。如何做到呢?步驟如下: 右鍵單擊“微信”圖標,選擇屬性,目標框內的路徑就是微信安裝路徑,複製目標框里的內容。 將如下命令複製到 TXT 文件保存,再將該文件重命名,主要是將尾碼名改成“.bat”文件。 @echo ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...