日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JS第三方中间件的延伸

發布時間:2025/3/21 javascript 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JS第三方中间件的延伸 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

js中間件

當我們在編寫業務代碼時候,我們無法避免有些業務邏輯復雜而導致業務代碼寫得又長又亂,如果再加上時間緊湊情況下寫出來的代碼估計會更讓人抓狂。以至于我們一直在尋求更好的架構設計和更好的代碼設計,這是一個沒有終點的求知之路,但是在這條路上會越走越好。

在前端,我們可以借用這種思想通過before和after函數來實現:

Function.prototype.before = function(fn){//函數處理前執行fn var self = this; return function(){ fn.call(this); self.apply(this, arguments); } } Function.prototype.after = function(fn){//函數處理后執行fn var self = this; return function(){ self.apply(this, arguments); fn.call(this); } }

實現思路是對被處理的函數通過閉包封裝在新的函數里,在新的函數內部按照順序執行傳入的參數fn和被處理的函數。

1 舉個例:

用戶提交表單數據之前需要用戶行為統計,代碼應該是這樣寫:

function report(){ console.log('上報數據'); } function submit(){ console.log('提交數據'); } submit.before(report)(); //提交之前執行report //結果: 上報數據 // 提交數據

從代碼可以看出已經把統計和數據提交業務隔離起來,互不影響。

但是如果提交數據之前,需要數據驗證并且依據驗證結果判斷是否能提交,怎么做?這里要改動before函數,看下代碼:

Function.prototype.before = function(fn){//函數處理后執行fn var self = this; return function(){ var res = fn.call(this); if(res)//返回成功則執行函數 self.apply(this, arguments); } } function report(){ console.log('上報數據'); return true; } function validate(){ console.log('驗證不通過'); return false; } function submit(){ console.log('提交數據'); } submit.before(report).before(validate)(); //結果: // 驗證不通過 function report(){ console.log('上報數據'); return true; } function validate(){ console.log('驗證通過'); return true; } function submit(){ console.log('提交數據'); } submit.before(report).before(validate)(); //結果: // 驗證通過 // 上報數據 // 提交數據

上面的例子如果很復雜會出現很長的鏈式,后期維護也很容易看暈,并且before和after也沒有考慮到異步操作,顯然還是有些不足的,那么還有沒有其他解決辦法呢,既能隔離業務,又能方便清爽地使用~我們可以先看看其他框架的中間件解決方案。

2 express

express是非常輕量的框架,express是集合路由和其他幾個中間件合成的web開發框架,koa是express原班人馬重新打造一個更輕量的框架,所以koa已經被剝離所有中間件,甚至連router中間件也被抽離出來,任由用戶自行添加第三方中間件。解析express的寫法

express的中間件寫法如下:

var express = require('express'); var app = express(); app.use(function(req, res, next) { console.log('數據統計'); next();//執行權利傳遞給 }); app.use(function(req, res, next) { console.log('日志統計'); next(); }); app.get('/', function(req, res, next) { res.send('Hello World!'); }); app.listen(3000); //整個請求處理過程就是先數據統計、日志統計,最后返回一個Hello World!

從上圖來看,每一個“管道”都是一個中間件,每個中間件通過next方法傳遞執行權給下一個中間件,express就是一個收集并調用各種中間件的容器。

中間件就是一個函數,通過express的use方法接收中間件,每個中間件有express傳入的req,res和next參數。如果要把請求傳遞給下一個中間件必須使用 next() 方法。當調用res.send方法則此次請求結束,node直接返回請求給客戶,但是若在res.send方法之后調用next方法,整個中間件鏈式調用還會往下執行,因為當前hello world所處的函數也是一塊中間件,而res.send只是一個方法用于返回請求。

3 參照express我們可以仿寫

我們可以借用中間件思想來分解我們的前端業務邏輯,通過next方法層層傳遞給下一個業務。做到這幾點首先必須有個管理中間件的對象,我們先創建一個名為Middleware 的對象:

function Middleware(){ this.cache = []; }

Middleware通過數組緩存中間件。下面是next和use 方法:

Middleware.prototype.use = function(fn){if(typeof fn !== 'function'){ throw 'middleware must be a function'; } this.cache.push(fn); return this; } Middleware.prototype.next = function(fn){ if(this.middlewares && this.middlewares.length > 0 ){ var ware = this.middlewares.shift(); ware.call(this, this.next.bind(this)); } } Middleware.prototype.handleRequest = function(){//執行請求 this.middlewares = this.cache.map(function(fn){//復制 return fn; }); this.next(); }

我們用Middleware簡單使用一下:

var middleware = new Middleware(); middleware.use(function(next){console.log(1);next();}) middleware.use(function(next){console.log(2);next();}) middleware.use(function(next){console.log(3);}) middleware.use(function(next){console.log(4);next();}) middleware.handleRequest(); //輸出結果: //1 //2 //3 // 4沒有出來是因為上一層中間件沒有調用next方法,我們升級一下Middleware 高級使用 var middleware = new Middleware(); middleware.use(function(next){ console.log(1);next();console.log('1結束'); }); middleware.use(function(next){ console.log(2);next();console.log('2結束'); }); middleware.use(function(next){ console.log(3);console.log('3結束'); }); middleware.use(function(next){ console.log(4);next();console.log('4結束'); }); middleware.handleRequest(); //輸出結果: //1 //2 //3 //3結束 //2結束 //1 結束

每一個中間件執行權利傳遞給下一個中間件并等待其結束以后又回到當前并做別的事情,方法非常巧妙。

?

原文鏈接:https://www.cnblogs.com/wjd2221/p/7364221.html

轉載于:https://www.cnblogs.com/lcspring/p/10603165.html

總結

以上是生活随笔為你收集整理的JS第三方中间件的延伸的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲av无码一区二区三区网站 | 夜夜夜网 | 亚州av成人 | 亚洲av成人片色在线观看高潮 | 国产xxxxx | 翔田千里一区二区 | 欧美在线观看视频 | 国语对白做受按摩的注意事项 | 久久视频在线观看免费 | 韩日午夜在线资源一区二区 | 夜夜躁日日躁狠狠久久av | 日本美女黄色大片 | 神马午夜精品 | 日本黄色a视频 | av成人免费在线观看 | 中文字幕免费观看 | 久久久久亚洲av无码专区喷水 | 一级性爱视频 | 狠狠干五月天 | 在线播放成人 | 日本一区二区在线视频 | sese国产 | 亚洲涩涩 | 亚洲精品一区二区三区四区五区 | 不卡日本| 欧美一区二区三区视频在线 | 日韩高清在线一区 | 午夜欧美在线 | 日本艳妇 | 亚洲成人自拍网 | 婷婷免费视频 | 青青草国产在线观看 | 91九色偷拍 | 性网爆门事件集合av | 国产免费视频一区二区三区 | 一级视频在线免费观看 | 青青草华人在线视频 | 亚洲人成人一区二区在线观看 | 美国一级片网站 | 91蜜桃| 致命弯道8在线观看免费高清完整 | 亚洲第一综合网 | 啊v视频在线观看 | jzz国产 | 日韩美女免费视频 | 国产一二区在线观看 | 亚洲精品a级 | 吃奶摸下的激烈视频 | 国产精品jizz在线观看老狼 | 黑人巨茎大战欧美白妇 | 亚洲综合色成人 | 日日日日干 | 先锋影音av资源在线 | 东北少妇高潮抽搐 | 日韩欧美自拍偷拍 | 美女黄视频网站 | 国产一区二区在线观看免费 | 日日操日日碰 | 久久噜噜| 美女十八毛片 | 一本久道久久 | 成人动漫av在线 | 国产综合视频一区二区 | 中文字幕人妻熟女在线 | 制服丝袜先锋影音 | 免费在线观看一区 | 乱短篇艳辣500篇h文最新章节 | 蜜桃视频污 | 无遮挡裸光屁屁打屁股男男 | 欧美丝袜脚交 | 日韩在线激情视频 | 91成人在线免费观看 | 亚洲福利视频在线 | 成人免费无码大片a毛片抽搐色欲 | 狠狠干人人干 | 亚洲无线看 | 国产亚洲欧美日韩精品 | 五十路在线| 激情男女视频 | 久久国产精品网站 | 免费国产小视频 | 香蕉久久久久 | yw在线观看| 亚洲成人精品视频 | 欧美高清日韩 | 黄色片网站在线免费观看 | 精品国产aⅴ | 婷婷成人在线 | 黄色片毛片 | 午夜在线视频观看 | 久操国产在线 | 色综合图区 | 涩涩涩涩涩涩涩涩涩 | 亚洲成人第一区 | 成人无码av片在线观看 | 国产精品15p | 国产九色sp调教91 | 亚洲制服丝袜av | 国产亚洲精品久久久久久 |