成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

如何理解 koa 中間件執(zhí)行機(jī)制

charles_paul / 864人閱讀

摘要:注是先前版本處理異步函數(shù)的方式,通過(guò)可以將異步函數(shù)封裝成,傳入普通參數(shù)后形成僅需要參數(shù)的偏函數(shù),以此簡(jiǎn)化調(diào)用代碼目前中的偏函數(shù)已經(jīng)被無(wú)情地化了。

前幾天研究了TJ的koa/co4.x和一系列koa依賴(lài)的源碼,在知乎上做出了人生首次回答(而且我真得再也不想去知乎回答技術(shù)問(wèn)題了_(:з」∠)_),因此把文字搬到這里。

ES2015 Generator/Yield

關(guān)于Generator/Yield 這幾篇文章已經(jīng)寫(xiě)得足夠清晰了:

The Basics Of ES6 Generators

Diving Deeper With ES6 Generators

Going Async With ES6 Generators

Getting Concurrent With ES6 Generators

Koa的運(yùn)行機(jī)制

簡(jiǎn)單地畫(huà)了一張圖解釋koa的處理流程:

在koa里定義的middleware均為generator function(包括內(nèi)置在頂端的respond),這是為了能從任意middleware中容易地切換到其它middleware里(如果你是前端程序員,可以理解為瀏覽器捕獲事件的capture和propagation過(guò)程,如果你是python程序員,可以理解為jungle的middleware機(jī)制,如果你是Java程序員,這種方式則是典型的切面編程)。

為了實(shí)現(xiàn)這種橫穿多個(gè)middleware的特性,koa通過(guò)把后一個(gè)generator作為參數(shù)(koa里常用next)傳入前一個(gè)generator實(shí)現(xiàn)(#見(jiàn)koa-compose源碼,這也是為什么前兩個(gè)middleware有next參數(shù)而最后一個(gè)沒(méi)有)。

可以看到,在koa中yield的使用是在co,而co則是包裝了generator/yield & Promise以模擬async/await,提供了一個(gè)更高層次的異步語(yǔ)法抽象。

koa在加載且合并所有的middleware之后,傳遞給co執(zhí)行(確切地說(shuō)是在http.createServer的callback觸發(fā)后執(zhí)行),co以圖中所示邏輯不斷拆解generator function,執(zhí)行yield右側(cè)固定的幾種表達(dá)式(Array,Object,generator function,Promise,thunkify function),這5種表達(dá)式最終都會(huì)轉(zhuǎn)化為Promise,以達(dá)到處理異步函數(shù)的目的。

co內(nèi)部封裝了onFulfilled和onRejected函數(shù),當(dāng)yield右側(cè)的promise resolve之后,則會(huì)調(diào)用onFullfield函數(shù),其包含了一條關(guān)鍵語(yǔ)句gen.next(res)#這句代碼 用以給yield表達(dá)式賦值并執(zhí)行下一次迭代。

koa通過(guò)上文的方式「深入」->「淺出」,最終在頂層的respond middleware里send response。

  

注:#thunk是co先前版本處理異步函數(shù)的方式,通過(guò)thunk可以將異步函數(shù)封裝成curry,傳入普通參數(shù)后形成僅需要callback參數(shù)的偏函數(shù),以此簡(jiǎn)化callback調(diào)用代碼(目前co中的thunk偏函數(shù)已經(jīng)被#無(wú)情地Promise化了)。

by Abruzzi"s blog

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85704.html

相關(guān)文章

  • koa間件機(jī)制詳解

    摘要:在我眼中,的確是比輕量的多,給我的感覺(jué)更像是一個(gè)中間件框架,只是一個(gè)基礎(chǔ)的架子,需要用到的相應(yīng)的功能時(shí),用相應(yīng)的中間件來(lái)實(shí)現(xiàn)就好,諸如路由系統(tǒng)等?;诘膸?kù),所以利用來(lái)代替回調(diào),而由于對(duì)的支持,所以利用的是。 koa koa是由express原班人馬打造的一個(gè)更小、更富有表現(xiàn)力、更健壯的web框架。 在我眼中,koa的確是比express輕量的多,koa給我的感覺(jué)更像是一個(gè)中間件框架,k...

    Bmob 評(píng)論0 收藏0
  • generator探幽(1)--koa間件機(jī)制淺析

    摘要:當(dāng)運(yùn)行到時(shí),不會(huì)暫停,而是直接跳進(jìn)函數(shù)執(zhí)行函數(shù)內(nèi)的代碼。由于函數(shù)中沒(méi)有,因此會(huì)一直執(zhí)行完函數(shù)中的代碼,并返回至函數(shù)中執(zhí)行后面的代碼。 本系列旨在通過(guò)對(duì)co,koa等庫(kù)源碼的研究,進(jìn)而理解generator在異步編程中的重大作用(ps:所有代碼請(qǐng)?jiān)趎ode --harmony或者iojs環(huán)境中運(yùn)行) koa中間件的形式 相信用過(guò)koa的小伙伴一定很熟悉下面這段代碼 var app ...

    Jensen 評(píng)論0 收藏0
  • KOA2框架原理解析和實(shí)現(xiàn)

    摘要:實(shí)現(xiàn)的四大模塊上文簡(jiǎn)述了源碼的大體框架結(jié)構(gòu),接下來(lái)我們來(lái)實(shí)現(xiàn)一個(gè)的框架,筆者認(rèn)為理解和實(shí)現(xiàn)一個(gè)框架需要實(shí)現(xiàn)四個(gè)大模塊,分別是封裝創(chuàng)建類(lèi)構(gòu)造函數(shù)構(gòu)造對(duì)象中間件機(jī)制和剝洋蔥模型的實(shí)現(xiàn)錯(cuò)誤捕獲和錯(cuò)誤處理下面我們就逐一分析和實(shí)現(xiàn)。 什么是koa框架? ? ? ? ?koa是一個(gè)基于node實(shí)現(xiàn)的一個(gè)新的web框架,它是由express框架的原班人馬打造的。它的特點(diǎn)是優(yōu)雅、簡(jiǎn)潔、表達(dá)力強(qiáng)、自由度...

    tracymac7 評(píng)論0 收藏0
  • KOA2框架原理解析和實(shí)現(xiàn)

    摘要:實(shí)現(xiàn)的四大模塊上文簡(jiǎn)述了源碼的大體框架結(jié)構(gòu),接下來(lái)我們來(lái)實(shí)現(xiàn)一個(gè)的框架,筆者認(rèn)為理解和實(shí)現(xiàn)一個(gè)框架需要實(shí)現(xiàn)四個(gè)大模塊,分別是封裝創(chuàng)建類(lèi)構(gòu)造函數(shù)構(gòu)造對(duì)象中間件機(jī)制和剝洋蔥模型的實(shí)現(xiàn)錯(cuò)誤捕獲和錯(cuò)誤處理下面我們就逐一分析和實(shí)現(xiàn)。 什么是koa框架? ? ? ? ?koa是一個(gè)基于node實(shí)現(xiàn)的一個(gè)新的web框架,它是由express框架的原班人馬打造的。它的特點(diǎn)是優(yōu)雅、簡(jiǎn)潔、表達(dá)力強(qiáng)、自由度...

    liangzai_cool 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<