理解Koa2中的async await

2021-09-11 14:57:46 字數 1484 閱讀 3540

koa是一款非常著名的node服務端框架,有1.x版本和2.x版本。前者使用了generator來進行非同步操作,後者則用了最新的async/await方案

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

const koa = require('koa');

const dosomething = time => , time)

})}// 用來列印請求資訊

console.log(`$:::$`)

next()

}) const result = await dosomething(3000)

console.log(result);

ctx.body = result

})複製**

讓我們測試一下:

複製**

(3秒後...)task done!

複製**

(立即)

not found

複製**

什麼鬼?為什麼沒有按照預期執行?這就需要我們來理解下koa中中介軟體是如何串聯起來的了。翻一下原始碼,將middlewares串聯起來的**如下:

function

compose (middleware) ))

} catch (err) }}}

複製**

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

因為第乙個middleware並不是乙個非同步函式啊。

由於每次next方法的執行,實際上都是返回了乙個promise物件,所以如果我們在某個middleware中執行了非同步操作,要想等待其完成,就要在執行這個middleware之前新增await

那我們來改寫一下之前的**

console.log(`$:::$`)

await next()

}) const result = await dosomething(3000)

console.log(result);

ctx.body = result

})複製**

好了,沒有問題,一切如期望執行?

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

trycatch(err)

}) throw

newerror('something wrong!')

ctx.body = 'hello'

})複製**

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

Koa2基礎學習

01 環境準備 安裝搭建專案的開發環境 02 中介軟體用法 講解 koa2 中介軟體的用法及如何開發中介軟體 03 路由koa router 04 post get請求 常見請求方式處理 05 分層 梳理 漸近於 mvc 分層模式 06 檢視nunjucks koa 預設支援的模板引擎 07 處理靜...

koa2入門學習

koa模組 koa route 路由 route.get 路徑 路由函式 koa static 靜態資源載入 const serve 路徑 koa compose 中介軟體合成模組 koa body 提取表單post請求鍵值對,處理上傳檔案 上下文context的response和request c...

koa2中的ctx是什麼?

為了試圖搞明白,用console.log將它輸出 const koa require koa koa console.log ctx 列印的結果如下 response originalurl req res socket 可見它主要包括request和response兩部分。ctx是context的...