<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
        主站蜘蛛池模板: 国产a级特黄的片子视频免费| 免费毛片在线看片免费丝瓜视频| 成人免费网站久久久| 特级毛片A级毛片免费播放| 99久久免费国产精精品| 久久久久高潮毛片免费全部播放| 欧美最猛性xxxxx免费| 亚洲乱码中文字幕小综合| 老司机亚洲精品影院在线观看| 91视频免费网站| 亚洲一区爱区精品无码| 亚洲人成毛片线播放| 最近中文字幕2019高清免费| 亚洲欧洲精品久久| 亚洲区精品久久一区二区三区| 久久国产高潮流白浆免费观看| 夜夜亚洲天天久久| 羞羞视频免费网站入口| 亚洲国产V高清在线观看| 亚洲视频一区在线播放| 九九99热免费最新版| 日韩视频免费在线| 亚洲视频一区在线| 成人免费视频网址| 亚洲国产女人aaa毛片在线| 深夜久久AAAAA级毛片免费看| 亚洲综合av永久无码精品一区二区| 自拍日韩亚洲一区在线| 久久aⅴ免费观看| 亚洲国产精品一区二区第四页| 中国一级毛片视频免费看| 免费又黄又硬又爽大片| 国产成人精品日本亚洲专区6| 日韩激情无码免费毛片| 精品一区二区三区免费观看 | 成在线人永久免费视频播放| 曰批免费视频播放在线看片二 | 日本免费v片一二三区| 国产成人无码免费看片软件| 亚洲AV网站在线观看| 亚洲人成网站18禁止久久影院|