日韩性视频-久久久蜜桃-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第三方中间件的延伸的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 久久伊人精品视频 | 在线观看aa | 中文字幕三级视频 | 国产欧美一区二区三区在线看 | 久久精品这里只有精品 | 一本一道久久a久久综合蜜桃 | 韩国无码av片在线观看网站 | melody在线高清免费观看 | 另类激情综合 | 性――交――性――乱睡觉 | 精品国产乱子伦一区二区 | 美女污污网站 | 国产一区二区久久久 | 国产麻豆一精品一男同 | 玖玖玖精品| 欧美不卡一区二区 | 风间由美一区二区 | 成人一区二区三区在线观看 | 中文字幕av日韩 | 欧美日韩中文在线观看 | 国产伦精品一区二区三区视频黑人 | 国产又粗又黄又猛 | 黄色免费网页 | 日日草夜夜草 | 亚洲精品麻豆 | 色天天色 | 国产美女主播视频 | 99re热在线视频 | 国产在线播放网站 | 91精产国品一二三区在线观看 | 男女做事网站 | 中文字幕在线观看二区 | 久久资源在线 | 亚洲25p | 亚洲婷婷小说 | 处破女av一区二区 | 国产一区二区在线播放视频 | 91青青青| 色吧久久 | 天天干b| 美日韩一区二区三区 | 国产99在线播放 | 久久精品国产亚洲7777 | 波多野结衣高清在线 | 免费看黄色三级 | 亚洲区久久| 免费看成人毛片 | 五月天婷婷激情视频 | 欧美永久精品 | 午夜少妇视频 | 国产影音先锋 | 国产精品高潮AV无码 | 亚洲av无码国产综合专区 | www.色午夜 | 日韩福利电影在线观看 | 乳色吐息在线看 | 一级黄色短片 | 小视频在线 | 又黄又爽又色的视频 | 欧洲视频在线观看 | 亚洲黄色在线免费观看 | 青青草成人免费视频 | 欧美顶级毛片在线播放 | 国产精品成人午夜视频 | 日日夜夜av | 欧美性区 | 九九视频这里只有精品 | 三级性视频 | 奇米影音 | 综合五月激情 | 性欧美bbw| 天天射夜夜操 | 色婷婷精品久久二区二区密 | 男人天堂一区二区 | 四虎少妇做爰免费视频网站四 | 伊甸园精品区 | 青青导航 | 久久综合中文字幕 | 干爹你真棒插曲免费 | 亚洲国产精品久久久久爰性色 | caopeng在线视频 | 国产123在线| 免费看色| 中文字幕制服丝袜 | 欧美自拍视频 | kk视频在线观看 | 色欧美在线 | 欧美一级片一区 | 97中文字幕在线观看 | 国产亚洲精品成人av久久ww | 日本不卡1| 男女性生活毛片 | av拍拍拍| 久久久精品日本 | 免费成人高清 | 亚洲乱妇 | 97在线精品 | 亚洲精品一级 | 丁香激情视频 |