<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

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

        來源:懂視網(wǎng) 責編:小采 時間:2020-11-27 22:14:53
        文檔

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

        async/await地獄該如何避免詳解:前言 async/await是什么 async/await可以說是co模塊和生成器函數(shù)的語法糖。用更加清晰的語義解決js異步代碼。 熟悉co模塊的同學(xué)應(yīng)該都知道,co模塊是TJ大神寫的一個使用生成器函數(shù)來解決異步流程的模塊,可以看做是生成器函數(shù)的執(zhí)行器。而async/awa
        推薦度:
        導(dǎo)讀async/await地獄該如何避免詳解:前言 async/await是什么 async/await可以說是co模塊和生成器函數(shù)的語法糖。用更加清晰的語義解決js異步代碼。 熟悉co模塊的同學(xué)應(yīng)該都知道,co模塊是TJ大神寫的一個使用生成器函數(shù)來解決異步流程的模塊,可以看做是生成器函數(shù)的執(zhí)行器。而async/awa

        問題

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

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

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

        這兩組操作應(yīng)該是并發(fā)執(zhí)行的。

        再來看一個更差的例子

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

        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 循環(huán)必須等待 sendRequest() 函數(shù)完成才能繼續(xù)下一次迭代。但是,我們并不需要等待。我們希望盡快發(fā)送所有請求。然后我們可以等待所有請求完成。

        現(xiàn)在你應(yīng)該已經(jīng)對 async/await 地獄有跟多的了解,現(xiàn)在我們再來考慮一個問題

        如果我們忘記 await 關(guān)鍵字會怎么樣?

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

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

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

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

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

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

        應(yīng)該如何避免 async/await 地獄

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

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

        同時執(zhí)行這些異步函數(shù)。

        我們來重寫這寫例子:

        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
        })()

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

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

        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
        }

        總結(jié)

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

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

        async/await地獄該如何避免詳解:前言 async/await是什么 async/await可以說是co模塊和生成器函數(shù)的語法糖。用更加清晰的語義解決js異步代碼。 熟悉co模塊的同學(xué)應(yīng)該都知道,co模塊是TJ大神寫的一個使用生成器函數(shù)來解決異步流程的模塊,可以看做是生成器函數(shù)的執(zhí)行器。而async/awa
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 成在线人免费无码高潮喷水| 亚洲AV一区二区三区四区| 一级毛片无遮挡免费全部| 美女被免费视频网站a国产| 国产成人精品日本亚洲直接| 99久久免费观看| 在线免费观看亚洲| 亚洲成人免费电影| 亚洲制服在线观看| 成人免费视频观看无遮挡| 亚洲高清国产拍精品熟女| 日韩a在线观看免费观看| 日日摸日日碰夜夜爽亚洲| 亚洲av中文无码| 国产一二三四区乱码免费| 亚洲AV无码日韩AV无码导航| 日本免费一区二区久久人人澡| 亚洲电影免费在线观看| 久久精品无码专区免费青青| 久久精品亚洲AV久久久无码| 成人啪精品视频免费网站| 老司机福利在线免费观看| 国产亚洲综合一区柠檬导航| 99视频免费播放| 亚洲精品自偷自拍无码| 免费一级毛片不卡在线播放| a在线观看免费网址大全| 亚洲国产美女福利直播秀一区二区| 亚洲免费网站观看视频| 日本精品久久久久久久久免费| 国产亚洲真人做受在线观看| 最近中文字幕免费完整 | 亚洲级αV无码毛片久久精品| 无码免费一区二区三区免费播放| 亚洲国产精品综合福利专区| 人人狠狠综合久久亚洲高清| 免费人成毛片动漫在线播放| 在线a亚洲老鸭窝天堂av高清| 亚洲三区在线观看无套内射| 免费看美女裸露无档网站| 麻豆一区二区三区蜜桃免费|