摘要:注是先前版本處理異步函數的方式,通過可以將異步函數封裝成,傳入普通參數后形成僅需要參數的偏函數,以此簡化調用代碼目前中的偏函數已經被無情地化了。
前幾天研究了TJ的koa/co4.x和一系列koa依賴的源碼,在知乎上做出了人生首次回答(而且我真得再也不想去知乎回答技術問題了_(:з」∠)_),因此把文字搬到這里。
ES2015 Generator/Yield關于Generator/Yield 這幾篇文章已經寫得足夠清晰了:
The Basics Of ES6 Generators
Diving Deeper With ES6 Generators
Going Async With ES6 Generators
Getting Concurrent With ES6 Generators
Koa的運行機制簡單地畫了一張圖解釋koa的處理流程:
在koa里定義的middleware均為generator function(包括內置在頂端的respond),這是為了能從任意middleware中容易地切換到其它middleware里(如果你是前端程序員,可以理解為瀏覽器捕獲事件的capture和propagation過程,如果你是python程序員,可以理解為jungle的middleware機制,如果你是Java程序員,這種方式則是典型的切面編程)。
為了實現這種橫穿多個middleware的特性,koa通過把后一個generator作為參數(koa里常用next)傳入前一個generator實現(#見koa-compose源碼,這也是為什么前兩個middleware有next參數而最后一個沒有)。
可以看到,在koa中yield的使用是在co,而co則是包裝了generator/yield & Promise以模擬async/await,提供了一個更高層次的異步語法抽象。
koa在加載且合并所有的middleware之后,傳遞給co執行(確切地說是在http.createServer的callback觸發后執行),co以圖中所示邏輯不斷拆解generator function,執行yield右側固定的幾種表達式(Array,Object,generator function,Promise,thunkify function),這5種表達式最終都會轉化為Promise,以達到處理異步函數的目的。
co內部封裝了onFulfilled和onRejected函數,當yield右側的promise resolve之后,則會調用onFullfield函數,其包含了一條關鍵語句gen.next(res)#這句代碼 用以給yield表達式賦值并執行下一次迭代。
koa通過上文的方式「深入」->「淺出」,最終在頂層的respond middleware里send response。
注:#thunk是co先前版本處理異步函數的方式,通過thunk可以將異步函數封裝成curry,傳入普通參數后形成僅需要callback參數的偏函數,以此簡化callback調用代碼(目前co中的thunk偏函數已經被#無情地Promise化了)。
by Abruzzi"s blog
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/85704.html
摘要:在我眼中,的確是比輕量的多,給我的感覺更像是一個中間件框架,只是一個基礎的架子,需要用到的相應的功能時,用相應的中間件來實現就好,諸如路由系統等。基于的庫,所以利用來代替回調,而由于對的支持,所以利用的是。 koa koa是由express原班人馬打造的一個更小、更富有表現力、更健壯的web框架。 在我眼中,koa的確是比express輕量的多,koa給我的感覺更像是一個中間件框架,k...
摘要:當運行到時,不會暫停,而是直接跳進函數執行函數內的代碼。由于函數中沒有,因此會一直執行完函數中的代碼,并返回至函數中執行后面的代碼。 本系列旨在通過對co,koa等庫源碼的研究,進而理解generator在異步編程中的重大作用(ps:所有代碼請在node --harmony或者iojs環境中運行) koa中間件的形式 相信用過koa的小伙伴一定很熟悉下面這段代碼 var app ...
摘要:實現的四大模塊上文簡述了源碼的大體框架結構,接下來我們來實現一個的框架,筆者認為理解和實現一個框架需要實現四個大模塊,分別是封裝創建類構造函數構造對象中間件機制和剝洋蔥模型的實現錯誤捕獲和錯誤處理下面我們就逐一分析和實現。 什么是koa框架? ? ? ? ?koa是一個基于node實現的一個新的web框架,它是由express框架的原班人馬打造的。它的特點是優雅、簡潔、表達力強、自由度...
摘要:實現的四大模塊上文簡述了源碼的大體框架結構,接下來我們來實現一個的框架,筆者認為理解和實現一個框架需要實現四個大模塊,分別是封裝創建類構造函數構造對象中間件機制和剝洋蔥模型的實現錯誤捕獲和錯誤處理下面我們就逐一分析和實現。 什么是koa框架? ? ? ? ?koa是一個基于node實現的一個新的web框架,它是由express框架的原班人馬打造的。它的特點是優雅、簡潔、表達力強、自由度...
閱讀 2702·2021-09-22 15:58
閱讀 2241·2019-08-29 16:06
閱讀 914·2019-08-29 14:14
閱讀 2816·2019-08-29 13:48
閱讀 2463·2019-08-28 18:01
閱讀 1510·2019-08-28 17:52
閱讀 3332·2019-08-26 14:05
閱讀 1627·2019-08-26 13:50