欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

koa之中間件流程控制的示例分析-創(chuàng)新互聯(lián)

這篇文章主要為大家展示了“koa之中間件流程控制的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“koa之中間件流程控制的示例分析”這篇文章吧。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),九江企業(yè)網(wǎng)站建設(shè),九江品牌網(wǎng)站建設(shè),網(wǎng)站定制,九江網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,九江網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

1. koa中間件執(zhí)行流程

關(guān)于koa中間件如何執(zhí)行,官網(wǎng)上有一個(gè)非常經(jīng)典的例子,有興趣的可以去看看,不過這里,我想把它修改的更簡單一點(diǎn):

var koa = require('koa');
var app = koa();
app.use(function*(next) {
console.log('begin middleware 1');
yield next;
console.log('end middleware 1');
});
app.use(function*(next) {
console.log('begin middleware 2');
yield next;
console.log('end middleware 2');
});
app.use(function*() {
console.log('middleware 3');
});
app.listen(3000);

運(yùn)行這個(gè)例子,然后使用curl工具,運(yùn)行:

curl http://localhost:3000

可以看到,運(yùn)行之后,會(huì)輸出:

begin middleware 1
begin middleware 2
middleware 3
end middleware 2
end middleware 1

這個(gè)例子非常形象的代表了koa的中間件執(zhí)行機(jī)制,可以用下圖的洋蔥模型來形容:

koa之中間件流程控制的示例分析

通過這種執(zhí)行流程,開發(fā)者可以非常方便的開發(fā)一些中間件,并且非常容易的整合到實(shí)際業(yè)務(wù)流程中。那么,這樣的流程又是如何實(shí)現(xiàn)和控制的呢?

2. koa中的generator和compose

簡單來說,洋蔥模型的執(zhí)行流程是通過es6中的generator來實(shí)現(xiàn)的。不熟悉generator的同學(xué)可以去看看其特性,其中一個(gè)就是generator函數(shù)可以像打斷點(diǎn)一樣從函數(shù)某個(gè)地方跳出,之后還可以再回來繼續(xù)執(zhí)行。下面一個(gè)例子可以說明這種特性:

var gen=function*(){
console.log('begin!');
//yield語句,在這里跳出,將控制權(quán)交給anotherfunc函數(shù)。
yield anotherfunc;
//下次回來時(shí)候從這里開始執(zhí)行
console.log('end!');
}
var anotherfunc(){
console.log('this is another function!');
}
var g=gen();
var another=g.next(); //'begin!'
//another是一個(gè)對象,其中value成員就是返回的anotherfunc函數(shù)
another.value(); //'this is another function!'
g.next(); //'end!';

從這個(gè)簡單例子中,可以看出洋蔥模型最基本的一個(gè)雛形,即yield前后的語句最先和最后執(zhí)行,yield中間的代碼在中心執(zhí)行。

現(xiàn)在設(shè)想一下,如果yield后面跟的函數(shù)本身就又是一個(gè)generator,會(huì)怎么樣呢?其實(shí)就是從上面例子里面做一個(gè)引申:

var gen1=function*(){
console.log('begin!');
yield g2;
console.log('end!');
}
var gen2=function*(){
console.log('begin 2');
yield anotherfunc;
console.log('end 2');
}
var anotherfunc(){
console.log('this is another function!');
}
var g=gen();
var g2=gen2();
var another1=g.next(); //'begin!';
var another2=another1.value.next(); //'begin 2';
another2.value(); //'this is another function!';
another1.value.next(); //'end 2';
g.next(); //'end!';

可以看出,基本上是用上面的例子,再加一個(gè)嵌套而已,原理是一樣的。

而在koa中,每個(gè)中間件generator都有一個(gè)next參數(shù)。在我們這個(gè)例子中,g2就可以看成是g函數(shù)的next參數(shù)。事實(shí)上,koa也確實(shí)是這樣做的,當(dāng)使用app.use()掛載了所有中間件之后,koa有一個(gè)koa-compose模塊,用于將所有g(shù)enerator中間件串聯(lián)起來,基本上就是將后一個(gè)generator賦給前一個(gè)generator的next參數(shù)。koa-compose的源碼非常簡單短小,下面是我自己實(shí)現(xiàn)的一個(gè):

function compose(middlewares) {
return function(next) {
var i = middlewares.length;
var next = function*() {}();
while (i--) {
next = middlewares[i].call(this, next);
}
return next;
}
}

使用我們自己寫的compose對上面一個(gè)例子改造,是的其更接近koa的形式:

function compose(middlewares) {
return function(next) {
var i = middlewares.length;
var next = function*() {}();
while (i--) {
next = middlewares[i].call(this, next);
}
return next;
}
}
var gen1=function*(next){
console.log('begin!');
yield next;
console.log('end!');
}
var gen2=function*(next){
console.log('begin 2');
yield next;
console.log('end 2');
}
var gen3=function*(next){
console.log('this is another function!');
}
var bundle=compose([gen1,gen2,gen3]);
var g=bundle();
var another1=g.next(); //'begin!';
var another2=another1.value.next(); //'begin 2';
another2.value.next(); //'this is another function!';
another1.value.next(); //'end 2';
g.next(); //'end!';

怎么樣?是不是有一點(diǎn)koa中間件寫法的感覺了呢?但是目前,我們還是一步一步手動(dòng)的在執(zhí)行我們這個(gè)洋蔥模型,能否寫一個(gè)函數(shù),自動(dòng)的來執(zhí)行我們這個(gè)模型呢?

3. 讓洋蔥模型自動(dòng)跑起來:一個(gè)run函數(shù)的編寫

上面例子中,最后的代碼我們可以看出一個(gè)規(guī)律,基本就是外層的generator調(diào)用next方法把控制權(quán)交給內(nèi)層,內(nèi)層再繼續(xù)調(diào)用next把方法交給更里面的一層。整個(gè)流程可以用一個(gè)函數(shù)嵌套的寫法寫出來。話不多說,直接上代碼:

function run(gen) {
var g;
if (typeof gen.next === 'function') {
g = gen;
} else {
g = gen();
}
function next() {
var tmp = g.next();
//如果tmp.done為true,那么證明generator執(zhí)行結(jié)束,返回。
if (tmp.done) {
return;
} else if (typeof g.next === 'function') {
run(tmp.value);
next();
}
}
next();
}
function compose(middlewares) {
return function(next) {
var i = middlewares.length;
var next = function*() {}();
while (i--) {
next = middlewares[i].call(this, next);
}
return next;
}
}
var gen1 = function*(next) {
console.log('begin!');
yield next;
console.log('end!');
}
var gen2 = function*(next) {
console.log('begin 2');
yield next;
console.log('end 2');
}
var gen3 = function*(next) {
console.log('this is another function!');
}
var bundle = compose([gen1, gen2, gen3]);
run(bundle);

run函數(shù)接受一個(gè)generator,其內(nèi)部執(zhí)行其實(shí)就是我們上一個(gè)例子的精簡,使用遞歸的方法執(zhí)行。運(yùn)行這個(gè)例子,可以看到結(jié)果和我們上一個(gè)例子相同。

到此為止,我們就基本講清楚了koa中的中間件洋蔥模型是如何自動(dòng)執(zhí)行的。事實(shí)上,koa中使用的co函數(shù),一部分功能就是實(shí)現(xiàn)我們這里編寫的run函數(shù)的功能。

以上是“koa之中間件流程控制的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)頁題目:koa之中間件流程控制的示例分析-創(chuàng)新互聯(lián)
分享鏈接:http://chinadenli.net/article18/dchddp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、App開發(fā)定制開發(fā)、小程序開發(fā)云服務(wù)器、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
男人和女人黄 色大片| 欧美激情床戏一区二区三| 日本东京热视频一区二区三区| 麻豆视传媒短视频免费观看| 欧美日韩国产成人高潮| 日韩国产传媒在线精品| 国产精品乱子伦一区二区三区| 二区久久久国产av色| 日本人妻精品中文字幕不卡乱码| 国产精品日韩欧美第一页| 欧美中文字幕日韩精品| 国产成人国产精品国产三级| 国产女性精品一区二区三区| 在线免费看国产精品黄片| 青青操视频在线观看国产| 亚洲一区二区精品福利| 高潮少妇高潮久久精品99| 午夜国产精品福利在线观看| 久热99中文字幕视频在线| 国产综合香蕉五月婷在线| 国产精品日本女优在线观看| 福利视频一区二区在线| 免费亚洲黄色在线观看| 国产精品一区二区日韩新区| 欧美区一区二区在线观看| 亚洲国产精品久久综合网| 人妻一区二区三区在线| 日本欧美视频在线观看免费| 黄片免费在线观看日韩| 日本中文在线不卡视频| 日本加勒比中文在线观看| 不卡视频免费一区二区三区| 中文字幕人妻日本一区二区| 亚洲欧美中文日韩综合| 99国产一区在线播放| 熟妇久久人妻中文字幕| 国产日本欧美韩国在线| 午夜精品在线观看视频午夜| 国产又粗又硬又长又爽的剧情| 91人妻久久精品一区二区三区 | 日韩一本不卡在线观看|