摘要:用法回顧執(zhí)行順序每當(dāng)執(zhí)行時,執(zhí)行下一個中間件,執(zhí)行到最后一個中間件后開始往回執(zhí)行源碼解析源碼執(zhí)行步驟使用方法即將進中的數(shù)組中方法調(diào)用的和方法來創(chuàng)建服務(wù),的回掉執(zhí)行下面的操作回掉首先執(zhí)行方法將組合成一個對象來執(zhí)行,這個對象即可完成中
用法回顧
const Koa = require("koa"); const app = new Koa(); app.use(async (ctx, next) => { fn1(); await next(); fn2(); }); app.use(async (ctx, next) => { fn3(); await next(); fn4() }); app.use(async (ctx, next) => { fn5(); await next(); fn6() }); app.listen(3000);
執(zhí)行順序 fn1 -> fn3 -> fn5 -> fn6 -> fn4 -> fn2
每當(dāng)執(zhí)行next時,執(zhí)行下一個中間件,執(zhí)行到最后一個中間件后開始往回執(zhí)行
使用use方法即將middleware push 進koa中的this.middleware數(shù)組中
listen方法調(diào)用node的http.createServer和server.listen方法來創(chuàng)建服務(wù),createServer的回掉執(zhí)行下面的操作
回掉首先執(zhí)行compose(this.middleware)方法將middleware組合成一個promise對象來執(zhí)行,這個promise對象即可完成中間件級聯(lián)的操作
將回掉傳出的值req和res用于創(chuàng)建一個context對象,里面包含了request對象和response對象,這些對象提供了許多后臺開發(fā)需要的參數(shù)和方法
執(zhí)行中間件
得到結(jié)果給respond方法格式化數(shù)據(jù)
或者捕獲異常給onerror方法處理異常
composekoa源碼最重要的部分,如何實現(xiàn)中間件級聯(lián),以下是compose方法的源碼(為方便觀看,部分進行了ES6處理)
function compose (middleware) { if (!Array.isArray(middleware)) throw new TypeError("Middleware stack must be an array!") for (const fn of middleware) { if (typeof fn !== "function") throw new TypeError("Middleware must be composed of functions!") } return function (context, next) { // last called middleware # let index = -1 return dispatch(0) function dispatch (i) { if (i <= index) return Promise.reject(new Error("next() called multiple times")) index = i let fn = middleware[i] if (i === middleware.length) fn = next // next = undefined if (!fn) return Promise.resolve() // 當(dāng)運行到最后一個middleware時結(jié)束 try { return Promise.resolve( fn(context, next = () => dispatch(i + 1)) ) } catch (err) { return Promise.reject(err) } } } }
compose方法使用遞歸的方式遍歷每一個middleware
遍歷時將下一個middleware當(dāng)作next傳遞給當(dāng)前的middleware
更多文章 yjy5264.github.io文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/94172.html
摘要:中異步處理在中使用的是,在中使用的是,我們本次采用來處理異步。函數(shù)參數(shù)為的數(shù)組,數(shù)組成員是通過方法添加的中間件。小結(jié)從最開始的編寫中間件,到現(xiàn)在閱讀函數(shù)源碼,中間件機制并不復(fù)雜,了解之后,我們可以運用編寫更合適的中間件,構(gòu)建自己的應(yīng)用。 上一篇講了如何編寫屬于自己的 Koa 中間件,本篇將根據(jù)原理實現(xiàn)一個簡單的中間件處理函數(shù),并對 Koa 中間件處理函數(shù) compose 函數(shù)進行源碼解...
摘要:實現(xiàn)的四大模塊上文簡述了源碼的大體框架結(jié)構(gòu),接下來我們來實現(xiàn)一個的框架,筆者認(rèn)為理解和實現(xiàn)一個框架需要實現(xiàn)四個大模塊,分別是封裝創(chuàng)建類構(gòu)造函數(shù)構(gòu)造對象中間件機制和剝洋蔥模型的實現(xiàn)錯誤捕獲和錯誤處理下面我們就逐一分析和實現(xiàn)。 什么是koa框架? ? ? ? ?koa是一個基于node實現(xiàn)的一個新的web框架,它是由express框架的原班人馬打造的。它的特點是優(yōu)雅、簡潔、表達力強、自由度...
摘要:實現(xiàn)的四大模塊上文簡述了源碼的大體框架結(jié)構(gòu),接下來我們來實現(xiàn)一個的框架,筆者認(rèn)為理解和實現(xiàn)一個框架需要實現(xiàn)四個大模塊,分別是封裝創(chuàng)建類構(gòu)造函數(shù)構(gòu)造對象中間件機制和剝洋蔥模型的實現(xiàn)錯誤捕獲和錯誤處理下面我們就逐一分析和實現(xiàn)。 什么是koa框架? ? ? ? ?koa是一個基于node實現(xiàn)的一個新的web框架,它是由express框架的原班人馬打造的。它的特點是優(yōu)雅、簡潔、表達力強、自由度...
閱讀 3876·2021-07-28 18:10
閱讀 2583·2019-08-30 15:44
閱讀 1094·2019-08-30 14:07
閱讀 3466·2019-08-29 17:20
閱讀 1583·2019-08-26 18:35
閱讀 3542·2019-08-26 13:42
閱讀 1822·2019-08-26 11:58
閱讀 1594·2019-08-23 18:33