• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題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關鍵字專題關鍵字專題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的用法

    來源:懂視網 責編:小采 時間:2020-11-27 22:20:05
    文檔

    理解Koa2中的async&await的用法

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

    Koa是一款非常著名的Node服務端框架,有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

    期望結果:

    (3秒后...)task done!

    然而現實卻是:

    (立即)
    Not Found

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

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

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

    因為第一個middleware并不是一個異步函數啊。

    由于每次next方法的執行,實際上都是返回了一個Promise對象,所以如果我們在某個middleware中執行了異步操作,要想等待其完成,就要在執行這個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
    })
    
    

    好了,沒有問題,一切如期望執行: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

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

    文檔

    理解Koa2中的async&await的用法

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

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 精品久人妻去按摩店被黑人按中出| 精品久久久久久久中文字幕| MM1313亚洲精品无码| 亚洲高清国产AV拍精品青青草原| 亚洲欧美日韩精品永久在线| 精品免费久久久久久久| 欧美精品亚洲精品日韩精品| 91嫩草亚洲精品| 99久久精品国内| 久久影院综合精品| 亚洲精品乱码久久久久久蜜桃| 国产乱人伦偷精品视频免观看| 青青青国产精品国产精品久久久久| 久久精品国产亚洲AV电影| 自拍偷自拍亚洲精品第1页| 久久久99精品一区二区 | 日韩精品一区二区三区视频| 9久热这里只有精品| 久久精品国产秦先生| 国产91精品一区二区麻豆网站| 国产精品国色综合久久| 久久99国产综合精品女同| 亚洲AV第一页国产精品| 亚洲欧洲精品无码AV| 亚洲愉拍99热成人精品热久久| 一本久久精品一区二区| 最新精品露脸国产在线| 久久久久国产精品麻豆AR影院| 国产成人高清精品免费观看| 久久九九有精品国产23百花影院| 国产精品久久亚洲不卡动漫| 99久久精品国产麻豆| 精品视频在线免费观看| 国产日韩欧美精品| 久久精品国产亚洲沈樵| 91精品国产自产在线老师啪| 亚洲自偷自偷精品| 国产精品青青在线观看爽香蕉| 国产精品一区二区久久精品无码| 精品欧美一区二区三区久久久| 精品国内自产拍在线观看|