koa洋蔥模型原理

async function m1(next) {
    console.log('m1')

    await next()

    console.log('e')
}

async function m2(next) {
    console.log('m2')

    await next()

    console.log('d')
}

async function m3(next) {
    console.log('m3')
    
    await next()
}

const next3 = async () => {
    m3()
}

const next2 = async () => {
    m2(next3)
}

const next1 = async () => {
    m1(next2)
}

next1()

// 輸出:
// m1
// m2
// m3
// d
// e

首先逸贾,關(guān)于 洋蔥模型 自上而下-》自下而上 回溯機制并不是 koa 自己的特性次询,而是 async/await 自己執(zhí)行順序的特定峰鄙,就是 async/await 自帶這個特性

可以寫個 demo 驗證一下:

async function a1() {
    console.log('a1')
    await a2()
    console.log('a3')
}

async function a2() {
    console.log('a2')
}

a1()
// 輸出
// a1
// a2
// a3

也就是, await 執(zhí)行時栖袋,會先去執(zhí)行后面的 異步函數(shù)叹卷,等待后面 異步函數(shù)有了結(jié)果舒岸,才會繼續(xù)執(zhí)行 await 后面的代碼绅作,自己本身就具有 “回溯機制”

koa 只是做了一件事,就是 創(chuàng)建了 next 函數(shù)蛾派,這個函數(shù)的作用就是調(diào)用下一個中間件

下一個中間件同樣需要 next 參數(shù)俄认,所以我們需要依照中間件列表倒序構(gòu)建 next 函數(shù),先構(gòu)建最后一個中間件需要的 next 函數(shù)洪乍,然后再構(gòu)建倒數(shù)第二個中間件需要的 next 函數(shù)...以此類推

最后呢眯杏,所有中間件就構(gòu)成了一條鏈。我們調(diào)用鏈開頭的 next 函數(shù)壳澳,每個鏈條節(jié)點中又調(diào)用

await next()

調(diào)用下一個中間件岂贩,最終所有中間件都得到了執(zhí)行。

構(gòu)建 next 函數(shù)我們可以封裝一下巷波,是這個樣子:

function createNext (middleware, oldNext) {
    return async () => {
        await middleware(ctx, oldNext)
    }
}

const len = this.middlewares.length;
let next = async () => {
    return Promise.resolve()
}

for (let i = len - 1; i >= 0; i--) {
    let currentMiddleware = this.middlewares[i]
    next = createNext(currentMiddleware, next)
}

await next()

同時萎津,為了使最后一個中間件也有 next 參數(shù),我們可以創(chuàng)造一個空的 async 函數(shù)

const next = async () {}
//...
m3(next)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抹镊,一起剝皮案震驚了整個濱河市锉屈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌垮耳,老刑警劉巖颈渊,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異终佛,居然都是意外死亡俊嗽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門铃彰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乌询,“玉大人,你說我怎么就攤上這事豌研∶锰铮” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵鹃共,是天一觀的道長鬼佣。 經(jīng)常有香客問我,道長霜浴,這世上最難降的妖魔是什么晶衷? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮阴孟,結(jié)果婚禮上晌纫,老公的妹妹穿的比我還像新娘。我一直安慰自己永丝,他們只是感情好锹漱,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著慕嚷,像睡著了一般哥牍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喝检,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天嗅辣,我揣著相機與錄音,去河邊找鬼挠说。 笑死澡谭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的损俭。 我是一名探鬼主播蛙奖,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼撩炊!你這毒婦竟也來了外永?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拧咳,失蹤者是張志新(化名)和其女友劉穎伯顶,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骆膝,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡祭衩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了阅签。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掐暮。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖政钟,靈堂內(nèi)的尸體忽然破棺而出路克,到底是詐尸還是另有隱情樟结,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布精算,位于F島的核電站瓢宦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏灰羽。R本人自食惡果不足惜驮履,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望廉嚼。 院中可真熱鬧玫镐,春花似錦、人聲如沸怠噪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舰绘。三九已至蹂喻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捂寿,已是汗流浹背口四。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秦陋,地道東北人蔓彩。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像驳概,于是被迫代替她去往敵國和親赤嚼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354