亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

async/await地獄該如何避免詳解

2019-11-19 13:53:07
字體:
來源:轉載
供稿:網友

前言

async/await是什么

async/await可以說是co模塊和生成器函數的語法糖。用更加清晰的語義解決js異步代碼。

熟悉co模塊的同學應該都知道,co模塊是TJ大神寫的一個使用生成器函數來解決異步流程的模塊,可以看做是生成器函數的執行器。而async/await則是對co模塊的升級,內置生成器函數的執行器,不再依賴co模塊。同時,async返回的是Promise。

從上面來看,不管是co模塊還是async/await,都是將Promise作為最基礎的單元,對Promise不很了解的同學可以先深入了解一下Promise

async/await 寫著很爽,不過要注意這些問題。

async/await 讓我們擺脫了回調地獄,但是這又引入了 async/await 地獄的問題。

什么是 async/await 地獄

在 Javascript 中進行異步編程的時候,人們總是使用很多 await 語句,很多時候我們的語句并不需要依賴于之前的語句,這樣就會導致性能問題。

async/await 地獄的例子

我們試著寫一個購買披薩和飲料的程序:

(async () => { const pizzaData = await getPizzaData() // async call const drinkData = await getDrinkData() // async call const chosenPizza = choosePizza() // sync call const chosenDrink = chooseDrink() // sync call await addPizzaToCart(chosenPizza) // async call await addDrinkToCart(chosenDrink) // async call orderItems() // async call})()

這段代碼運行沒有問題。但是不是一個好的實現,因為這增加了不必要的等待。

說明

我們已經將我們的代碼封裝在異步 IIFE 中,按照下面的順序執行:

得到披薩名單
獲取飲料列表
從列表中選擇一個披薩
從列表中選擇一種飲料
將選中的披薩加入購物車
將選擇的飲品加入購物車
訂購購物車中的物品

問題

這里有個問題為什么從列表中選擇披薩這個動作要等待獲取飲料列表?這兩個是沒什么關聯的操作。其中的關聯操作有兩組:

獲取披薩列表 -》 選擇披薩 -》 選擇披薩加入購物車

獲取飲料列表 -》 選擇飲料 -》 選擇飲料加入購物車

這兩組操作應該是并發執行的。

再來看一個更差的例子

這個 Javascript 代碼片段將購物車中的商品并發出訂購請求。

async function orderItems() { const items = await getCartItems() // async call const noOfItems = items.length for(var i = 0; i < noOfItems; i++) { await sendRequest(items[i]) // async call }}

這種情況 for 循環必須等待 sendRequest() 函數完成才能繼續下一次迭代。但是,我們并不需要等待。我們希望盡快發送所有請求。然后我們可以等待所有請求完成。

現在你應該已經對 async/await 地獄有跟多的了解,現在我們再來考慮一個問題

如果我們忘記 await 關鍵字會怎么樣?

如果在調用異步函數忘記使用 await,這意味著執行該功能不需要等待。異步函數將直接返回一個 promise,你可以稍后使用。

(async () => { const value = doSomeAsyncTask() console.log(value) // an unresolved promise})()

或者是程序不清楚你想要等待函數執行完,直接退出不會完成這個異步任務。所以我們需要使用 await 這個關鍵字。

promise 有一個有趣的屬性,你可以在某行代碼中獲取 promise,然后在其他地方中等待它 resolve,這是解決 async/await 地獄的關鍵。

(async () => { const promise = doSomeAsyncTask() const value = await promise console.log(value) // the actual value})()

如你所見 doSomeAsyncTask 直接返回一個 Promise 同時這個異步函數 doSomeAsyncTask 已經開始執行,為了得到 doSomeAsyncTask 的返回值,我們需要 await 來告訴

應該如何避免 async/await 地獄

首先我們需要知道哪些命名是有前后依賴關系的。

然后將有依賴關系的系列操作進行分組合并成一個異步操作。

同時執行這些異步函數。

我們來重寫這寫例子:

async function selectPizza() { const pizzaData = await getPizzaData() // async call const chosenPizza = choosePizza() // sync call await addPizzaToCart(chosenPizza) // async call}async function selectDrink() { const drinkData = await getDrinkData() // async call const chosenDrink = chooseDrink() // sync call await addDrinkToCart(chosenDrink) // async call}(async () => { const pizzaPromise = selectPizza() const drinkPromise = selectDrink() await pizzaPromise await drinkPromise orderItems() // async call})()// Although I prefer it this way(async () => { Promise.all([selectPizza(), selectDrink()].then(orderItems) // async call})()

我們將語句分成兩個函數。在函數內部,每個語句都依賴于前一個語句的執行。然后我們同時執行這兩個函數 selectPizza()和selectDrink() 。

在第二個例子中我們需要處理未知數量的 Promise。處理這個問題非常簡單,我們只需要創建一個數組將所有 Promise 存入其中,使用 Promise.all() 方法并行執行:

async function orderItems() { const items = await getCartItems() // async call const noOfItems = items.length const promises = [] for(var i = 0; i < noOfItems; i++) { const orderPromise = sendRequest(items[i]) // async call promises.push(orderPromise) // sync call } await Promise.all(promises) // async call}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品香蕉国产| 97精品欧美一区二区三区| 国产精品xxx视频| 欧美电影免费看| 精品国产欧美一区二区三区成人| 欧美国产高跟鞋裸体秀xxxhd| 日韩国产精品视频| 国产精品一区二区三区免费视频| 久久久久久久久久久久久久久久久久av| 国产精品91视频| 北条麻妃在线一区二区| 欧洲亚洲在线视频| 久久伊人91精品综合网站| 亚洲精品乱码久久久久久金桔影视| 国产精品白嫩美女在线观看| 亚洲精品有码在线| 精品夜色国产国偷在线| 在线观看视频99| 亚洲视频日韩精品| www.美女亚洲精品| 国产精品毛片a∨一区二区三区|国| 久久久久久久影院| 成人免费福利在线| 欧美另类第一页| 大荫蒂欧美视频另类xxxx| 欧美日韩在线视频一区| 精品国产乱码久久久久久天美| 91热福利电影| 69av成年福利视频| 最近2019中文免费高清视频观看www99| 国产在线拍揄自揄视频不卡99| 97超级碰碰碰| 在线观看国产精品日韩av| 国内精品一区二区三区四区| 日韩一区二区欧美| 国产99久久久欧美黑人| 日本成人在线视频网址| 亚洲丝袜在线视频| 96精品久久久久中文字幕| 成人午夜激情免费视频| 日韩中文字在线| 欧美性videos高清精品| 亚洲国产精品美女| 欧美激情视频在线| 亚洲综合社区网| 日韩亚洲精品电影| 国产成人精品网站| 欧美大片欧美激情性色a∨久久| 日韩在线观看电影| 疯狂做受xxxx高潮欧美日本| 97精品免费视频| 欧美高清视频在线播放| 欧美专区在线观看| 成人久久久久久久| 国产亚洲精品综合一区91| 青青草国产精品一区二区| 欧美激情高清视频| 亚洲图片制服诱惑| 青青草一区二区| 日韩免费av片在线观看| 欧美成人性生活| 欧美丰满少妇xxxxx| 97色在线观看免费视频| 精品精品国产国产自在线| 中文字幕av一区二区| 精品国产一区二区在线| 国产精品稀缺呦系列在线| 国产婷婷97碰碰久久人人蜜臀| 亚洲欧美日韩精品久久亚洲区| 最新91在线视频| 91极品女神在线| 欧美精品久久久久久久免费观看| 亚洲精品mp4| 在线观看免费高清视频97| 欧美精品videosex牲欧美| 成人久久久久久久| 粉嫩av一区二区三区免费野| 青青精品视频播放| 97精品伊人久久久大香线蕉| 欧美高跟鞋交xxxxxhd| 粉嫩av一区二区三区免费野| 尤物yw午夜国产精品视频| 久久亚洲精品国产亚洲老地址| 日韩日本欧美亚洲| 亚洲a一级视频| 国产一区红桃视频| 欧美电影在线观看高清| 欧美性猛交xxxx乱大交| 最近更新的2019中文字幕| 国产精品久久久久久久午夜| 国产盗摄xxxx视频xxx69| 日本精品免费观看| 国产精品激情av在线播放| 精品亚洲一区二区三区在线播放| 日本精品中文字幕| 欧美成人精品一区二区三区| www.日韩.com| 欧美激情在线狂野欧美精品| 欧美夫妻性生活视频| 91欧美精品午夜性色福利在线| 欧美夜福利tv在线| 欧美电影院免费观看| 久久69精品久久久久久久电影好| 日韩av网站导航| 欧美性色视频在线| 久久天天躁狠狠躁夜夜av| 国产精品久久77777| 91精品国产网站| 成人免费看片视频| 国产suv精品一区二区三区88区| 久久久久久国产免费| 亚洲无av在线中文字幕| 国产视频一区在线| 久久69精品久久久久久国产越南| 一区二区三区高清国产| 精品国产91久久久| 久久综合国产精品台湾中文娱乐网| 九九久久综合网站| 亚洲精品国产精品国自产观看浪潮| 国产日韩欧美91| 亚洲国产精品va| 亚洲女人被黑人巨大进入al| 亚洲自拍小视频免费观看| 97久久久免费福利网址| 国产午夜一区二区| 中文精品99久久国产香蕉| 国产视频丨精品|在线观看| 久久手机免费视频| 高清欧美性猛交xxxx黑人猛交| 91精品视频在线免费观看| 国产精品h在线观看| 亚洲人成人99网站| 日韩毛片中文字幕| 国产精品无av码在线观看| 精品欧美aⅴ在线网站| 国产日韩欧美一二三区| 亚洲第一精品夜夜躁人人躁| 欧美一乱一性一交一视频| 国产日韩精品在线观看| 午夜精品视频在线| 久久夜色精品国产| 精品av在线播放| 亚洲网站视频福利| 欧美午夜片在线免费观看| 精品亚洲一区二区三区在线观看| 国产91热爆ts人妖在线| 欧美激情高清视频| 国产精品成人久久久久| 欧美丝袜美女中出在线| 日韩免费在线观看视频| 国产91免费观看| 亚洲国产精品久久久久秋霞蜜臀| 欧美精品手机在线| 91av国产在线| 欧美中文字幕在线观看| 日韩欧美成人免费视频| 免费av一区二区| 欧美激情精品久久久| 色综合久久久888| 久久这里只有精品99| 亚洲老板91色精品久久| 亚洲欧美日韩高清| 国产精品av在线播放| 日本不卡免费高清视频|