日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

用vue設(shè)計(jì)一個(gè)數(shù)據(jù)采集器

瀏覽:186日期:2022-09-30 14:58:04
場景

在業(yè)務(wù)上現(xiàn)在有一個(gè)場景,當(dāng)發(fā)生業(yè)務(wù)行為變化時(shí),需要對(duì)各個(gè)模塊的行為進(jìn)行數(shù)據(jù)收集,數(shù)據(jù)用途可以用作回顧,也可以是例如監(jiān)控這樣的場景。

核心問題

說白了這個(gè)需求就是需要對(duì)各個(gè)模塊狀態(tài)變更進(jìn)行記錄,然后再格式化上傳到服務(wù)端。解題思路有兩種一種是狀態(tài)監(jiān)聽,第二主動(dòng)收集。

狀態(tài)監(jiān)聽狀態(tài)監(jiān)聽優(yōu)勢

快速實(shí)現(xiàn)利用狀態(tài)管理和wacth的機(jī)制很快就知道不同模塊的狀態(tài)變更,然后就可以獲取數(shù)據(jù),再格式化數(shù)據(jù),發(fā)送給服務(wù)端

狀態(tài)監(jiān)聽劣勢 wacth的重復(fù)監(jiān)聽,只要使用了wacth,不管是不是你所需要的數(shù)據(jù),只要狀態(tài)變更就會(huì)觸發(fā)改變,監(jiān)聽行為 重復(fù)依賴,比如說全局有個(gè)開始結(jié)束的狀態(tài),在使用wacth的時(shí)候就需要在不同的wacth中都去判斷這個(gè)狀態(tài),或者有全局的時(shí)間模塊等等 重復(fù)書寫,在不同的監(jiān)聽中需要實(shí)踐相同的數(shù)據(jù)格式化方法 數(shù)據(jù)分布混亂,雖然控制了全局使用同一管道上傳,但是對(duì)于同一個(gè)管道內(nèi)的數(shù)據(jù)想做合并去重,或者其他自定義的操作,在不同類型數(shù)據(jù),同一管道的這個(gè)場景下面支持很弱 場景區(qū)分困難,正常流程觸發(fā)的監(jiān)聽是沒有問題,如果是異常場景觸發(fā)恢復(fù)的監(jiān)聽就會(huì)導(dǎo)致判斷的復(fù)雜性 描述的還是比較抽象看下代碼示例

function useA(){ wacth(new,old){ if(start){ if(new.type ==’need’) const a = { a:new.a } const aa = { aa:new.aa } upload(a) upload(aa) } }}// 多處數(shù)據(jù)散落function useB(){ // 重復(fù)監(jiān)聽 wacth(new,old){ // 全局判斷 if(start){ // 不同狀態(tài)判斷 if(new.type ==’need’) const b = { b:new.b } //重復(fù)數(shù)據(jù)格式 const aa = { b:new.aa } upload(b) upload(aa) } }}重構(gòu)實(shí)現(xiàn)思路 依賴收集(監(jiān)聽者模式) 狀態(tài)統(tǒng)一 數(shù)據(jù)自治(策略模式) 依賴收集 核心思想:希望使用同一個(gè)采集器解決整個(gè)業(yè)務(wù)流程,數(shù)據(jù)變更在各個(gè)變更方,通過采集器提供的標(biāo)準(zhǔn)的格式化方法去處理數(shù)據(jù),再把數(shù)據(jù)傳遞到采集器,采集器收到數(shù)據(jù)后根據(jù)不同的數(shù)據(jù)格式插入到不同的緩存通道,緩存通道緩存成功,通知業(yè)務(wù)處理的監(jiān)聽者,根據(jù)不同的數(shù)據(jù)類型進(jìn)行不同的處理方式,最后發(fā)送到服務(wù)端。 具體代碼如下

/* * @Description: 采集公共類 * @version: 1.0.0 * @Author: 吳文周 * @Date: 2021-04-20 19:44:35 * @LastEditors: 吳文周 * @LastEditTime: 2021-04-22 15:20:50 *//** * @name: Dep * @msg: 依賴收集對(duì)象 */class Dep { private subs: any = [] // 添加觀察者 public addSub(sub: any) { if (sub && sub.update) { this.subs.push(sub) } } // 發(fā)送通知 public notify(content: any) { this.subs.forEach((sub: any) => { sub.update(content) }) }}/** * @name: Watcher * @msg: 觀察者對(duì)象 */class Watcher { private cb!: (arg: any) => void constructor(cb: (arg: any) => void) { // 回調(diào)函數(shù)負(fù)責(zé)更新 this.cb = cb } // 當(dāng)數(shù)據(jù)發(fā)生變化的時(shí)候更新 update(content: any) { this.cb(content) }}/** * @name: Channel * @msg: 緩存消息管道 */class Channel { // 管道存儲(chǔ)數(shù)組 private queue: any = [] // 管道大小 private limitSize = 1 // 管道名稱 public name: string constructor(name: string, limitSize = 1) { this.name = name // 最小尺寸是1 limitSize = limitSize >= 1 ? limitSize : 1 this.limitSize = limitSize } /** * @name: push * @msg: 添加的數(shù)據(jù) */ push(item: any) { // 如果超出限制尺寸移除第一個(gè) if (this.limitSize == this.queue.length) { this.queue.shift() } this.queue.push(item) } /** * @name: getLast * @msg: 獲取最后添加的數(shù)據(jù) */ getLast() { if (this.queue.length > 0) { return this.queue[this.queue.length - 1] } else { throw new Error(’no item return’) } } /** * @name: getLastIndex * @msg: 獲取最后倒數(shù)的數(shù)據(jù) */ getLastIndex(index: number) { try { return this.queue[this.queue.length - index - 1] } catch (error) { throw new Error(’no item return’) } } /** * @name: isEmpty * @msg: 管道是否為空 */ isEmpty() { return this.queue.length == 0 }}export class Collection { // 依賴收集對(duì)象 private dep = new Dep() // 各個(gè)數(shù)據(jù)頻道分類 private dataQueue = [’A’, ’B’, ’C’] // 頻道集合 private channelMap = new Map() // 上傳隊(duì)列 private MQ!: LiveCollectionMQ // 策略模式:數(shù)據(jù)類型不同對(duì)應(yīng)不同的處理機(jī)制 private strategies = { A: () => { // 可以在不同的管道中獲取相對(duì)應(yīng)的數(shù)據(jù)進(jìn)行不同邏輯的處理 }, B: () => { }, C: () => { }, } as Record<NotifyType, any> constructor() { this.init() } private init() { // 初始化watcher this.intWatcher() // 初始化頻道 this.initChannel() // 初始化數(shù)據(jù) this.initData() // 初始化隊(duì)列 this.initMQ() } /** * @name:intWatcher * @msg:初始化監(jiān)聽器 */ private intWatcher() { this.dep.addSub( new Watcher((type: NotifyType) => {const handlerBack = this.getHandler(type)handlerBack() }), ) } /** * @name: initChannel * @msg: 初始化頻道 */ private initChannel() { this.dataQueue.forEach(item => { this.channelMap.set(item, new Channel(item, 3)) }) } /** * @name: initData * @msg: 初始化頻道數(shù)據(jù) * @param {*} */ private initData() { } /** * @name: initMQ * @msg: 初始化上傳隊(duì)列 */ private initMQ() { } /** * @name: getMQ * @msg:獲取消息隊(duì)列 */ public getMQ() { return this.MQ } /** * @name:getChannel * @msg:根據(jù)頻道名稱獲取頻道實(shí)例 * @param {name}頻道名稱 */ private getChannel(name: NotifyType) { if (this.channelMap.get(name)) { return this.channelMap.get(name) } else { throw new Error(’no channel’) } } /** * @name:notify * @msg:依賴通知方法 * @param {NotifyType} type * @param {any} mes */ public notify(type: NotifyType, mes: any) { // 設(shè)置管道緩存 this.setChannel(type, mes) // 全局統(tǒng)一判斷狀態(tài)判斷是否要分發(fā)數(shù)據(jù) if (state.value.type) { this.dep.notify(type) } } /** * @name: setChannel * @msg: 設(shè)置頻道緩存 * @param {NotifyType} name * @param {any} mes */ private setChannel(name: NotifyType, mes: any) { const channel = this.getChannel(name) channel.push(mes) } /** * @name:getHandler * @msg: 獲取 * @param {NotifyType} name */ private getHandler(name: NotifyType) { return this.strategies[name] } /** * @name: getChannelLast * @msg: 獲取指定管道中的最新的數(shù)據(jù) * @param {NotifyType} name * @return {*} */ public getChannelLast(name: NotifyType) { try { const channel = this.getChannel(name) return channel.getLast() } catch (error) { throw new Error(error) } } /** * @name: getChannelLast * @msg: 獲取指定管道中的倒序數(shù)據(jù) * @param {NotifyType} name * @param {number} index */ public getChannelItemByLastIndex(name: NotifyType, index: number) { try { const channel = this.getChannel(name) return channel.getLastIndex(index) } catch (error) { throw new Error(error) } } /** * @name: generateA * @msg: 生成A數(shù)據(jù)方法 */ public generateA() { } /** * @name: generateB * @msg: 生成B數(shù)據(jù)方法 */ public generateB() { } /** * @name: generateC * @msg: 生成C數(shù)據(jù)方法 */ public generateC() { }}export const CollectionHelper = new Collection()總結(jié) 我覺得去了解一個(gè)框架的一個(gè)好的思路就是在運(yùn)用它的核心原理去解決一個(gè)原理,正如之前使用webpack的插件機(jī)制一樣,這次使用的是vue的依賴收集 狀態(tài)自治,職責(zé)統(tǒng)一是個(gè)代碼封裝的好習(xí)慣

以上就是用vue設(shè)計(jì)一個(gè)數(shù)據(jù)采集器的詳細(xì)內(nèi)容,更多關(guān)于vue 設(shè)計(jì)數(shù)據(jù)采集器的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
黑森林国产精品av| 亚洲少妇一区| 日本成人手机在线| 蜜臀va亚洲va欧美va天堂| 亚洲欧美日韩精品一区二区| 图片区亚洲欧美小说区| 国产一区清纯| 日韩免费在线| 久久久91麻豆精品国产一区| 国产精品一级| 日韩中文字幕亚洲一区二区va在线| 亚洲激情婷婷| 激情欧美一区| 色婷婷狠狠五月综合天色拍| 欧美肉体xxxx裸体137大胆| 国精品一区二区三区| 免费观看亚洲| 黄色在线网站噜噜噜| 精品久久影院| 国产一区二区三区四区| 久久精品网址| 国产aⅴ精品一区二区四区| 精品国产美女a久久9999| 久久这里只有| 麻豆精品国产91久久久久久| 欧美日韩网址| 国产美女久久| 国产精品网在线观看| 国产欧美91| 国产精品久久久久久模特| 国产麻豆一区| 日本成人在线一区| 日本在线不卡视频| 欧美激情日韩| 久久久久免费| 九色porny丨国产首页在线| 久久精选视频| 夜夜嗨一区二区| 中文一区一区三区免费在线观 | 欧美一级精品| 快she精品国产999| 国产欧美久久一区二区三区| 欧美日韩国产观看视频| 亚洲一区成人| 日本a级不卡| 免费视频一区二区三区在线观看 | 视频在线不卡免费观看| 在线天堂资源www在线污| 亚洲播播91| 亚洲一区国产一区| 日韩精品亚洲专区| 国产精品亚洲综合久久| 国产欧美自拍| 欧美激情综合| 日韩一区欧美| 国产偷自视频区视频一区二区| 日韩动漫一区| 国产成人免费视频网站视频社区| 国产精品精品国产一区二区| 国产精品91一区二区三区| 国产精品日本| 国产精品对白| 成人久久一区| 国产免费久久| 91精品国产调教在线观看| 美日韩精品视频| 精品三级在线| 在线亚洲自拍| 国产精品午夜av| 色综合www| 日韩中文字幕1| 国产剧情在线观看一区| 国产精品专区免费| 视频一区在线播放| 国产伦乱精品| 国产精品社区| 欧美交a欧美精品喷水| 欧美不卡高清| 91嫩草精品| 激情六月综合| 国产精品亚洲二区| 性欧美长视频| 久久免费精品| 日韩精品免费视频一区二区三区| 成人污污视频| 日韩中文字幕视频网| аⅴ资源天堂资源库在线| 亚洲一区二区三区高清不卡| 久久99精品久久久野外观看| 久久精品国产www456c0m| 在线观看亚洲精品福利片| 国产亚洲久久| 日韩不卡免费高清视频| 日本少妇精品亚洲第一区| 久久精品91| 国产精品草草| 最新国产拍偷乱拍精品| 精品日韩在线| **爰片久久毛片| 亚洲在线观看| 天堂资源在线亚洲| 高清一区二区三区| 国产伦乱精品| 男人的天堂亚洲一区| 婷婷综合社区| 国产精品videosex极品| 亚洲欧美日本国产| 久久中文亚洲字幕| 日韩 欧美一区二区三区| 亚洲免费精品| 日韩中文在线电影| 卡一卡二国产精品| 91在线成人| 视频国产精品| 狠狠色狠狠色综合日日tαg| 国产v日韩v欧美v| 国产精品手机在线播放| 欧美+日本+国产+在线a∨观看| 国产日韩中文在线中文字幕| 狠狠干综合网| 你懂的国产精品| 免费人成在线不卡| 欧美亚洲精品在线| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 国产精品亚洲综合色区韩国 | 日韩国产欧美在线视频| 亚洲午夜av| 欧美日韩精品在线一区| 91偷拍一区二区三区精品| 老司机精品视频在线播放| 亚洲在线观看| 亚洲欧美成人综合| 免费视频一区三区| 久久激情一区| 韩国久久久久久| 蜜桃av在线播放| 国产精品麻豆成人av电影艾秋| 欧美亚洲三级| 天堂精品久久久久| 中文字幕一区二区三区在线视频| 亚洲精品三级| 九九色在线视频| 伊人影院久久| 国产欧美日韩综合一区在线播放| 免费在线播放第一区高清av| 久久香蕉国产| 日韩一区二区三区四区五区| 久久国产视频网| 久久av影视| 亚洲免费高清| 国产精品国产一区| 激情欧美日韩一区| 欧美亚洲综合视频| 欧美aaaaaa午夜精品| 日韩欧美午夜| 国产精品成人自拍| 欧美成人亚洲| 日韩精品一二三四| 久久久精品区| 亚洲精选91| 日日夜夜免费精品视频| 人人精品久久| 国产精品亚洲一区二区在线观看| 日韩福利视频一区| 日本aⅴ精品一区二区三区 | 欧美色综合网| 亚洲+小说+欧美+激情+另类| 亚洲精品看片| 亚洲精品无播放器在线播放| 亚洲丝袜啪啪| 欧美日韩国产精品一区二区亚洲| 天使萌一区二区三区免费观看| 蜜臀a∨国产成人精品| 日韩精品久久久久久| 国产亚洲一区二区三区啪| 国产精品videossex| 日韩av在线播放网址| 久久蜜桃资源一区二区老牛| 9色国产精品| 国产欧美亚洲一区| 999视频精品| 日本视频中文字幕一区二区三区| 精品国产亚洲一区二区在线观看| 九九综合九九| 国产伦理一区| 国产激情久久| 亚洲国产日韩欧美在线| 性欧美精品高清| 欧美午夜不卡影院在线观看完整版免费| 欧美13videosex性极品| 婷婷综合成人| 中文字幕日韩高清在线| 国产精品久久久久av电视剧| 老鸭窝毛片一区二区三区| 老色鬼精品视频在线观看播放| 国产精品亚洲四区在线观看| 欧美.日韩.国产.一区.二区| 精品一区91| 五月激情久久| 福利片在线一区二区 |