摘要:注是先前版本處理異步函數(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
摘要:在我眼中,的確是比輕量的多,給我的感覺(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...
摘要:當(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 ...
摘要:實(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)、自由度...
摘要:實(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)、自由度...
閱讀 2704·2021-09-22 15:58
閱讀 2241·2019-08-29 16:06
閱讀 915·2019-08-29 14:14
閱讀 2818·2019-08-29 13:48
閱讀 2465·2019-08-28 18:01
閱讀 1514·2019-08-28 17:52
閱讀 3334·2019-08-26 14:05
閱讀 1628·2019-08-26 13:50