国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答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
主站蜘蛛池模板: 日韩欧美在线综合网高清 | 国产成人不卡亚洲精品91 | 一道本在线播放 | 青青国产成人久久91网 | 欧美日韩亚洲一区 | 亚洲色吧 | 亚洲一区中文字幕在线观看 | 国产精品视频第一页 | 午夜免费视频 | 黄网站色视频免费观看 | 国产精品久久久久久久专区 | 中文字幕亚洲综合 | 亚洲综合无码一区二区 | 日韩欧美系列 | 日韩在线免费播放 | 中文字幕欧美在线观看 | 国产精品特级毛片一区二区三区 | 在线欧美视频免费观看国产 | 国产精品国产精品国产专区不卡 | 2020精品极品国产色在线观看 | 精品欧美一区二区三区 | 国产午夜视频在线 | 在线欧美日韩制服国产 | 在线欧美色图 | 欧美一级色图 | 亚洲素人在线 | 国产在线视欧美亚综合 | 日本全黄视频 | 国产亚洲一区二区精品 | 国产精品亚洲综合 | 美日韩在线 | 国模私拍一区二区三区 | 免费又黄又爽又猛大片午夜 | 亚洲成a人一区二区三区 | 爱啪网亚洲第一福利网站 | 欧美激情一区二区三区视频 | 国产精品亚洲一区二区在线观看 | 特黄一级毛片 | 日韩在线综合 | 欧美日本道免费二区三区 | 国产精品va一区二区三区 |