async 和 await 原來這么簡單

前言

前端同學們可能都知道 asyncawait 的使用,當被面試官問到 asyncawait 的是什么?或者說一說你對 asyncawait 的理解?如果我們還是僅僅去闡述我是如何使用的就顯得格外的蒼白無力。今天博主就來帶大家進一步認識我們的 asyncawait。首先來說由于瀏覽器/引擎負責解釋和執行JavaScript的主線程是單線程,同步執行一個耗時較大的任務會導致阻塞。異步執行代碼就是來解決阻塞問題,但會帶來順序的不確定性(多個異步執行過程的不確定性)

回調函數

如果說這些異步之間不會相互依賴或者不會因為順序不確定收到影響是么有關系的,但是如果我們一些邏輯需要依賴某個異步的返回值那么這個時候我們就需要保證執行順序,這時候我們就需到了回調函數,舉個例子:fun2需要fun1異步執行后的結果,fun3又依賴于 fun2 異步執行結束后的結果,所以我們通過回調函數來保證執行順序。

在這里插入圖片描述

Promise

我們能夠看出上面的代碼中,多級嵌套的回調函數,弊端很多:不直觀,強耦合,回調的不確定性,不利于維護與復用,我們上面僅僅是非常簡單的一個場景,那如果我們有很復雜的需求的話非常多的回調嵌套就容易產生回調地獄。為了解決這個問題,Promise 出現了,它將這種回調函數的嵌套改為鏈式調用。并用then保證執行順序。Promise還能保證每次返回的都是一個新的Promise對象,所以代碼一定被異步執行。

在這里插入圖片描述

在這里插入圖片描述

我們發現上面的代碼可讀性就明顯略勝一籌,通過這樣一個鏈式的結構讓我們清晰的看出誰依賴誰,對我們的后期代碼維護更加友好,但這也僅僅是我們的一個小小的案例,如果是復雜的業務的話我們一直鏈式其實可讀性也會隨之增多也變得費勁。

async、await

Promise 是為了避免回調地獄的,但是 Promise 還是不夠簡明,語義化,隨著業務邏輯的增加可能會有超級多 then 于是有了async和await,先從字面意思來理解: async 是“異步”的簡寫,而 await 可以認為是 async wait 的簡寫,所以應該很好理解 async 用于申明一個 function 是異步的,而 await 用于等待一個異步方法執行完成。async 和 await 是es7提供的語法,是 es7最重要特性之一,相比于es6的promise ,具有更高的代碼可讀性,因此也被稱為promise 的語法糖。它把異步執行的代碼寫得像同步代碼那樣直觀。

async

快速創建一個異步函數,我們的 async 包裹后的函數就自動轉化成一個異步的 Promise 下面我們來證實一下

在這里插入圖片描述

在這里插入圖片描述

按照我們的理解,其實上面的log應該打印的是我們的 return 出來的幾何心涼對吧,但是他打印出來的是一個 Promise 等同于下面的代碼,當然這種只是我們的函數中僅僅是返回一個結果,但如果我們涉及到業務或者負責內容的時候還是需要我們去書寫 promise 的,這點也比較雞肋。

<body><script>function fun1() {let p = new Promise(rv => {rv('幾何心涼')})return p}console.log(fun1())</script>
</body>

await

await 并不是將異步代碼轉化成同步,他只是改變了調用方式,讓我們從調用的代碼層面看著相似于同步,從而增加代碼的可讀性;而且 await 也不是在任何地方都可以用的,它只能使用在 async 和模塊中使用,首先讓我們來看一下在 async 中的使用;

在這里插入圖片描述

在這里插入圖片描述

說明: 調用異步函數時,在函數前直接使用await對函數進行調用,一旦遇到await就會立即返回一個pending狀態的Promise對象,暫時返回執行代碼的控制權,使得函數外的代碼得以繼續執行,這是保證非阻塞的部分。他會等待 Promise 函數返回結果,可以通過變量來接收這個結果;既然是等待了那不就是說明阻塞了么?其實并不是我們可以看到圖中的 fun4 前面加上了 async 就說明我們的 fun4 是異步的了,異步代碼就不會阻塞后面的代碼執行,而我們的 await 是在異步函數中去控制了依賴項的執行順序。

當然在我們的 Promise 中我們出現了報錯我們是通過 catch 然后去處理的,在我們的 await 中我們又該如何處理呢?當然我們可以通過我們同步的辦法 try-catch 來處理異常

在這里插入圖片描述

剛才我們上面提到說我們的 await 可以在模塊中使用,下面我們來看一下如何在模塊中使用:上面的例子如果我們直接把黃色框中的內容放到我們的外部來;執行會報錯,但是我們把 script 的類型改成模塊就可以了;注意如果改成模塊的話,我們 await 只能在最外層作用域中使用;

在這里插入圖片描述

在這里插入圖片描述

小結

我們的代碼中會通過異步的方式來防止代碼阻塞,當我們多個異步之間有相互的執行結果依賴的時候我們就需要鎖定他們的執行順序,早起的回調函數為我們解決了不確定順序的問題,但是由于大批量的使用回調函數,造成代碼的可讀性、維護性非常低,后面出現了我們的 Promise 通過 then 進行鏈式結構,提高了可讀性,但是隨著業務的復雜度增加我們的鏈式可讀性也會隨之降低,所以es7出現了 async、await 改變了調用的方式,讓調用呈現出來的代碼相似于同步,進而提升代碼可讀性,async: 通過 async 聲明的函數,它的返回值會自動包裝為 Promise,它聲明的異步函數中可以通過 await 去調用其他的異步函數,await: 讓我們通過同步的方式去調用異步函數,讓我們的代碼可讀性更高,await 的使用位置有兩個,一個是我們 async 聲明的異步函數中,一個是我們的 js 模塊的最外層作用域中;

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

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

相關文章

研一寒假02-指針_new分配內存_使用new來創建動態數組_使用動態數組_使用delete來釋放new分配的內存...

#---------------------------------指針-----------------------------------# #include <iostream> int main(){ using namespace std; /* 指針引入 */ int updates 6; //聲明一個變量 int* p_updates; //聲明一個指針p_updates,該指針指向一個地址 p_updates&upd…

利用Windows內置工具winsat測試硬盤速度(SSD機械盤對比)

利用Windows內置工具winsat測試硬盤速度&#xff08;SSD&機械盤對比&#xff09; 以下是紅色內容是在命令行運行&#xff1a; C:\Users\Administrator>winsat diskWindows 系統評估工具> 正在運行: 功能枚舉 > 運行時間 00:00:00.00> 正在運行: 存儲評估 -seq …

我為何在 CSDN 樂在其中

文章目錄寫在前面成為博主究竟能得到什么&#xff1f;內在提升耀眼名片豐富眼界提升知名度博客》變現寫在最后寫在前面 各位伙伴大家好&#xff0c;我是幾何心涼&#xff0c;一位不是很大的也不是很小的博主&#xff0c;今天想要跟大家去聊一些比較實在的內容&#xff1b;大家能…

EFLinq查詢

1、無參數查詢var model db.Database.SqlQuery<UserInfo>("select* from UserInfoes ").ToList(); 2、有參查詢var model db.Database.SqlQuery<UserInfo>("select* from UserInfoes where idID ",new SqlParameter("ID",id)).ToL…

實現div可以調整高度(div實現resize)

實現div可以調整高度&#xff08;div實現resize&#xff09; 一、div 實現resize&#xff08;類似textarea&#xff09; 代碼如下&#xff1a; <!DOCTYPE html> <html><head><title>div實現textarea效果</title><style>#textarea {height:…

10分鐘設置免費遠程桌面

文章目錄前言遠程桌面設置教程啟動Amazon Lightsail實例配置遠程桌面啟動遠程桌面使用遠程桌面前言 “你見過洛杉磯凌晨4點的樣子嗎&#xff1f;” 沒有也沒關系&#xff0c;你可以輕松配置一臺位于洛杉磯的免費遠程桌面。 利用Amazon全球可用區&#xff0c;甚至可以在世界各…

樹莓派-開啟spi

1. sudo raspi-config #進入樹莓派配置頁 2. #進入每5項&#xff0c;進入啟用spi即可 轉載于:https://www.cnblogs.com/lobin/p/10459076.html

Lucene全文檢索過程

1. 索引過程&#xff1a; 1) 有一系列被索引文件 2) 被索引文件經過語法分析和語言處理形成一系列詞(Term)。 3) 經過索引創建形成詞典和反向索引表。 4) 通過索引存儲將索引寫入硬盤。 2. 搜索過程&#xff1a; 1) 用戶輸入查詢語句。 2) 對查詢語句經過語法分析和語言分析得到…

tcpdump 用法

原文鏈接 本文原文來自&#xff1a; A tcpdump Tutorial with Examples — 50 Ways to Isolate Traffic TCPDUMP 簡介 TCPDUMP 在一個界面中既提供了強大的功能又簡單易用&#xff0c;無疑已經是網絡分析工具中的老大。 本教程將介紹如何以各種方式隔離流量&#xff1a;從IP&am…

網絡端

1.synchronized 同步鎖 同步方法: 成員|靜態 簡單,但是鎖的范圍一般可能較大,效率低 同步塊 類的class:相當于鎖了類的整個信息|所有對象 this:鎖當前對象,鎖了這個對象的所有資源 資源:一般鎖不變的內容--對象地址 鎖的范圍太大效率低,鎖的范圍太小可能鎖不住 鎖一定要鎖不變的…

BZOJ2690: 字符串游戲(平衡樹動態維護Dfs序)

Description 給定N個僅有a~z組成的字符串ai,每個字符串都有一個權值vi,有M次操作&#xff0c;操作分三種&#xff1a;Cv x v:把第x個字符串的權值修改為vCs x a:把第x個字符串修改成aQ:求出當前的最大權字符串集合&#xff0c;使得這個集合中的字符串經過重新排列后滿足除最后一…

【第一趴】初探uni-app(uni-app發行者、uni-app推出背景、為什么選擇uni-app)

文章目錄寫在前面DCloud當下跨平臺開發存在的問題為什么選擇uni-app寫在最后寫在前面 聚沙成塔——每天進步一點點&#xff0c;大家好我是幾何心涼&#xff0c;不難發現越來越多的前端招聘JD中都加入了uni-app 這一項&#xff0c;它也已經成為前端開發者不可或缺的一項技能了&…

Rocket - tilelink - Atomics

https://mp.weixin.qq.com/s/TSwKL_qm-b-0e8x7r--hhg 簡單介紹Atomics中數學運算、邏輯運算的實現。??1. ioAtomics是一個硬件模塊&#xff0c;他繼承自Modules&#xff1a;??IO端口定義如下&#xff1a;??其中&#xff1a;a. write: 是否寫操作&#xff1b;b. a&#xf…

Spark streaming java代碼

待做轉載于:https://www.cnblogs.com/drjava/p/10464388.html

【第二趴】uni-app開發工具(手把手帶你安裝HBuilderX、搭建第一個多端項目初體驗)

文章目錄 寫在前面HBuilderXHBuilderX 優勢HBuilderX 安裝uni-app 初體驗寫在最后寫在前面 聚沙成塔——每天進步一點點,大家好我是幾何心涼,不難發現越來越多的前端招聘JD中都加入了uni-app 這一項,它也已經成為前端開發者不可或缺的一項技能了,所以涼哥為大家推出 聚沙成…

“勤學會”火爆來襲

文章目錄勤學會是什么&#xff1f;勤學會存在的意義是什么強大的助學團勤學會如何幫助大家學習參與勤學會能得什么獎品專屬C計劃加入勤學會勤學會是什么&#xff1f; 他來了他來了&#xff0c;其實兩個月前勤學會的概念產品就已經出現了&#xff0c;只不過因為了 1024 大型活動…

LeetCode -- 204. Count Primes

題目標簽 HashTab&#xff08;哈希表&#xff09; 題意及思路 題意&#xff1a;略 思路&#xff1a;有關素數的題目我所知道有兩種做法。一種是最基本的isPrime算法&#xff0c;關鍵點在循環判斷時&#xff0c;上限為Math.sqrt(n) &#xff08;求n是否為素數&#xff09;。另外…

如何尋找無序數組中的第K大元素?

如何尋找無序數組中的第K大元素&#xff1f; 有這樣一個算法題&#xff1a;有一個無序數組&#xff0c;要求找出數組中的第K大元素。比如給定的無序數組如下所示&#xff1a; 如果k6&#xff0c;也就是要尋找第6大的元素&#xff0c;很顯然&#xff0c;數組中第一大元素是24&am…

【第三趴】uni-app頁面搭建與路由配置(了解工程目錄結構、學會搭建頁面、配置路由并成功運行)

文章目錄 寫在前面工程結構新頁面呈現寫在最后本期推薦寫在前面 聚沙成塔——每天進步一點點,大家好我是幾何心涼,不難發現越來越多的前端招聘JD中都加入了uni-app 這一項,它也已經成為前端開發者不可或缺的一項技能了,所以涼哥為大家推出 聚沙成塔【45天玩轉uni-app】專欄…

測試MongoDB的自動分片

MongoDB的自動分片&#xff1a; test庫分片配置&#xff1a; db.shards.find(){ "_id" : "shard0000", "host" : "127.0.0.1:29017", "state" : 1 }{ "_id" : "shard0001", "host" : "1…