這次帶給大家怎麼處理async/await浪費效能問題,處理async/await浪費效能問題的注意事項有哪些,下面就是實戰案例,一起來看一下。
前言
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 <p style="text-align: left;">這種情況 for 迴圈必須等待 sendRequest() 函數完成才能繼續下一個迭代。但是,我們並不需要等待。我們希望盡快發送所有請求。然後我們可以等待所有請求完成。 </p><p style="text-align: left;">現在你應該已經對 async/await 地獄有跟多的了解,現在我們再來考慮一個問題</p><p style="text-align: left;"><strong>如果我們忘記 await 關鍵字會怎麼樣? </strong></p><p style="text-align: left;">如果在呼叫非同步函數忘記使用 await,這表示執行該功能不需要等待。非同步函數將直接傳回一個 promise,你可以稍後使用。 </p><pre class="brush:php;toolbar:false">(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 <p>相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!</p><p>推荐阅读:</p><p><a href="http://www.php.cn/js-tutorial-399218.html" target="_blank">React怎样在react-router路由实现登陆验证控制</a><br></p><p><a href="http://www.php.cn/js-tutorial-399230.html" target="_blank">Angular路由内路由守卫该如何使用</a><br></p>
以上是怎麼處理async/await浪費效能問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript字符串替換方法詳解及常見問題解答 本文將探討兩種在JavaScript中替換字符串字符的方法:在JavaScript代碼內部替換和在網頁HTML內部替換。 在JavaScript代碼內部替換字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 該方法僅替換第一個匹配項。要替換所有匹配項,需使用正則表達式並添加全局標誌g: str = str.replace(/fi

本教程向您展示瞭如何將自定義的Google搜索API集成到您的博客或網站中,提供了比標準WordPress主題搜索功能更精緻的搜索體驗。 令人驚訝的是簡單!您將能夠將搜索限制為Y

因此,在這裡,您準備好了解所有稱為Ajax的東西。但是,到底是什麼? AJAX一詞是指用於創建動態,交互式Web內容的一系列寬鬆的技術。 Ajax一詞,最初由Jesse J創造

本文系列在2017年中期進行了最新信息和新示例。 在此JSON示例中,我們將研究如何使用JSON格式將簡單值存儲在文件中。 使用鍵值對符號,我們可以存儲任何類型的

增強您的代碼演示文稿:10個語法熒光筆針對開發人員在您的網站或博客上共享代碼段的開發人員是開發人員的常見實踐。 選擇合適的語法熒光筆可以顯著提高可讀性和視覺吸引力。 t

利用輕鬆的網頁佈局:8 ESTISSEL插件jQuery大大簡化了網頁佈局。 本文重點介紹了簡化該過程的八個功能強大的JQuery插件,對於手動網站創建特別有用

本文介紹了關於JavaScript和JQuery模型視圖控制器(MVC)框架的10多個教程的精選選擇,非常適合在新的一年中提高您的網絡開發技能。 這些教程涵蓋了來自Foundatio的一系列主題

核心要點 JavaScript 中的 this 通常指代“擁有”該方法的對象,但具體取決於函數的調用方式。 沒有當前對象時,this 指代全局對象。在 Web 瀏覽器中,它由 window 表示。 調用函數時,this 保持全局對象;但調用對象構造函數或其任何方法時,this 指代對象的實例。 可以使用 call()、apply() 和 bind() 等方法更改 this 的上下文。這些方法使用給定的 this 值和參數調用函數。 JavaScript 是一門優秀的編程語言。幾年前,這句話可


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具