<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
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        理解Koa2中的async&await的用法

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

        理解Koa2中的async&await的用法

        理解Koa2中的async&await的用法:Koa是一款非常著名的Node服務(wù)端框架,有1.x版本和2.x版本。前者使用了generator來進行異步操作,后者則用了最新的async/await方案 一開始使用這種寫法的時候,我遇到一個問題,代碼如下: const Koa = require('koa'); const app =
        推薦度:
        導(dǎo)讀理解Koa2中的async&await的用法:Koa是一款非常著名的Node服務(wù)端框架,有1.x版本和2.x版本。前者使用了generator來進行異步操作,后者則用了最新的async/await方案 一開始使用這種寫法的時候,我遇到一個問題,代碼如下: const Koa = require('koa'); const app =

        Koa是一款非常著名的Node服務(wù)端框架,有1.x版本和2.x版本。前者使用了generator來進行異步操作,后者則用了最新的async/await方案

        一開始使用這種寫法的時候,我遇到一個問題,代碼如下:

        const Koa = require('koa');
        const app = new Koa();
        
        const doSomething = time => {
         return new Promise(resolve => {
         setTimeout(() => {
         resolve('task done!')
         }, time)
         })
        }
        
        // 用來打印請求信息
        app.use((ctx, next) => {
         console.log(`${ctx.method}:::${ctx.url}`)
         next()
        })
        
        app.use(async ctx => {
         const result = await doSomething(3000)
         console.log(result);
         ctx.body = result
        })
        
        app.listen(3000);
        
        

        讓我們測試一下:curl http://localhost:3000

        期望結(jié)果:

        (3秒后...)task done!

        然而現(xiàn)實卻是:

        (立即)
        Not Found

        什么鬼?為什么沒有按照預(yù)期執(zhí)行?這就需要我們來理解下Koa中中間件是如何串聯(lián)起來的了。翻一下源碼,將middlewares串聯(lián)起來的代碼如下:

        function compose (middleware) {
         return function (context, next) {
         // 這個index用來計數(shù),防止next被多次調(diào)用
         let index = -1
         // 執(zhí)行入口
         return dispatch(0)
         
         function dispatch (i) {
         // 如果next被多次調(diào)用,報異常
         if (i <= index) return Promise.reject(new Error('next() called multiple times'))
         index = i
         // 取出第一個middleware
         let fn = middleware[i]
         // 將最初傳入的next作為最后一個函數(shù)執(zhí)行
         if (i === middleware.length) fn = next
         if (!fn) return Promise.resolve()
         try {
         /**
         這里就是關(guān)鍵了,Promise.resolve是什么意思呢?
         Promise.resolve方法有下面三種形式:
         
         Promise.resolve(value);
         Promise.resolve(promise);
         Promise.resolve(theanable);
         
         這三種形式都會產(chǎn)生一個新的Promise。其中:
        
         第一種形式提供了自定義Promise的值的能力,它與Promise.reject(reason)對應(yīng)。兩者的不同,在于得到的Promise的狀態(tài)不同。
        
         第二種形式,提供了創(chuàng)建一個Promise的副本的能力。
        
         第三種形式,是將一個類似Promise的對象轉(zhuǎn)換成一個真正的Promise對象。它的一個重要作用是將一個其他實現(xiàn)的Promise對象封裝成一個當前實現(xiàn)的Promise對象。例如你正在用bluebird,但是現(xiàn)在有一個Q的Promise,那么你可以通過此方法把Q的Promise變成一個bluebird的Promise。第二種形式可以歸在第三種里面
         
         **/
         return Promise.resolve(fn(context, function next () {
         // 執(zhí)行下一個middleware,返回結(jié)果也是一個Promise
         return dispatch(i + 1)
         }))
         } catch (err) {
         return Promise.reject(err)
         }
         }
         }
        }
        
        

        有了以上基礎(chǔ),我們再來看一下之前的問題,為什么response沒有等到第二個middleware執(zhí)行完成就立即返回了呢?

        因為第一個middleware并不是一個異步函數(shù)啊。

        由于每次next方法的執(zhí)行,實際上都是返回了一個Promise對象,所以如果我們在某個middleware中執(zhí)行了異步操作,要想等待其完成,就要在執(zhí)行這個middleware之前添加await

        那我們來改寫一下之前的代碼

        app.use(async (ctx, next) => {
         console.log(`${ctx.method}:::${ctx.url}`)
         await next()
        })
        
        app.use(async ctx => {
         const result = await doSomething(3000)
         console.log(result);
         ctx.body = result
        })
        
        

        好了,沒有問題,一切如期望執(zhí)行:clap:

        錯誤處理

        借助了Promise強大的功力,配合async/await語法,我們只需要把try/catch的操作寫在最外層的middleware中,就可以捕獲到之后所有中間件的異常!

        app.use(async (ctx, next) => {
         try{
         await next()
         }catch(err){
         console.log(err)
         }
        })
        
        app.use(async (ctx)=>{
         throw new Error('something wrong!')
         ctx.body = 'Hello'
        })
        
        

        基于中間件鏈的完全控制,并且基于 Promise 的事實使得一切都變得容易操作起來。不再是到處的 if (err) return next(err) 而只有 promise

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

        文檔

        理解Koa2中的async&await的用法

        理解Koa2中的async&await的用法:Koa是一款非常著名的Node服務(wù)端框架,有1.x版本和2.x版本。前者使用了generator來進行異步操作,后者則用了最新的async/await方案 一開始使用這種寫法的時候,我遇到一個問題,代碼如下: const Koa = require('koa'); const app =
        推薦度:
        標簽: 使用 中使用 async
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 免费国产怡红院在线观看| 天天摸夜夜摸成人免费视频| 久久国产精品免费| 国产成人免费AV在线播放 | 精品日韩亚洲AV无码| 精品亚洲456在线播放| 国产精品亚洲一区二区在线观看 | 99热在线精品免费播放6| 国产大片91精品免费观看男同| 久久精品亚洲男人的天堂| 亚洲国产二区三区久久| 亚洲国产综合AV在线观看| 在线涩涩免费观看国产精品 | 久久久久亚洲AV成人网| 国产99视频精品免费视频76| 成年人视频在线观看免费| 亚洲色无码专区在线观看| 亚洲av午夜国产精品无码中文字 | 日本免费A级毛一片| 亚洲国产精品婷婷久久| 四虎最新永久免费视频| 亚洲人成无码网WWW| 亚洲人成色在线观看| 久久久精品2019免费观看| 亚洲午夜av影院| 亚洲午夜免费视频| 亚洲一区二区三区无码影院| 男人的天堂网免费网站| 久久久青草青青国产亚洲免观| 国产精品免费AV片在线观看| 亚洲av无码一区二区三区天堂古代| 鲁丝片一区二区三区免费| 国产成人亚洲精品影院| 无码少妇精品一区二区免费动态| 亚洲中文字幕一二三四区苍井空 | 久久久久久亚洲精品成人| 免费精品人在线二线三线区别| 久久精品九九亚洲精品| 四虎影院免费视频| 三年片在线观看免费| 亚洲无吗在线视频|