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

您的位置:首頁技術文章
文章詳情頁

用vue設計一個數據采集器

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

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

核心問題

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

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

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

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

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

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

以上就是用vue設計一個數據采集器的詳細內容,更多關于vue 設計數據采集器的資料請關注好吧啦網其它相關文章!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
四虎精品永久免费| 成人羞羞视频播放网站| 国产v日韩v欧美v| 精品一区二区三区免费看| 亚洲二区三区不卡| 亚洲电影在线一区二区三区| 手机在线电影一区| 成人在线网站| 亚洲精品看片| 精品72久久久久中文字幕| 桃色一区二区| 热久久久久久久| 另类综合日韩欧美亚洲| 精品无人区麻豆乱码久久久| 丝袜av一区| 久久精品国产免费| 久久精品亚洲一区二区| 日本午夜免费一区二区 | 亚洲国产成人精品女人| 在线中文字幕播放| 久久裸体视频| 国产精品日本| 亚洲不卡视频| 久久亚洲黄色| 婷婷精品视频| 免费亚洲婷婷| 成人福利视频| 18国产精品| 久久成人精品| 国产欧美亚洲精品a| 日韩精彩视频在线观看| 亚洲精品第一| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美日韩一二三四| 欧美1区2区3区| 99久久久久| 亚洲欧洲一区二区天堂久久| 久久三级视频| 激情综合婷婷| 四虎884aa成人精品最新| 视频精品一区二区| 日韩免费高清| 亚洲国产福利| 国产精品久久久久久久免费观看 | 久久中文视频| 欧美成人基地 | 亚洲自拍另类| 不卡视频在线| 美国三级日本三级久久99 | 蜜臀91精品一区二区三区| 蜜芽一区二区三区| 日本伊人久久| 麻豆视频久久| 精品捆绑调教一区二区三区| 尤物精品在线| 日韩高清二区| 麻豆视频一区二区| 欧美日韩亚洲三区| 欧美男人天堂| 国产日韩精品视频一区二区三区| 涩涩涩久久久成人精品| 美女尤物国产一区| 国产亚洲精品v| 精品国产美女a久久9999| 99视频在线精品国自产拍免费观看| 久久国产三级精品| 亚洲大全视频| 麻豆91在线播放| 蜜桃久久久久久| 久久久久国产| 久久99久久人婷婷精品综合| 妖精视频成人观看www| 国产精品tv| 亚洲天堂免费| 欧美日韩在线网站| 精品久久久久久久| 91精品国产自产在线丝袜啪| 亚洲大全视频| 涩涩av在线| 国产精品一区免费在线| 蜜臀av在线播放一区二区三区| 日韩在线看片| 精品国产精品久久一区免费式| 香蕉久久久久久| 自拍日韩欧美| 欧美成人基地| 一区二区精品伦理...| 国产三级精品三级在线观看国产| 亚洲激情欧美| 激情综合自拍| 国产精品精品| 美女久久久久久 | 蜜桃久久久久| 国产探花在线精品一区二区| 日韩中文字幕麻豆| 亚洲国产一区二区三区在线播放| 最新中文字幕在线播放 | 日韩中文字幕不卡| 尤物tv在线精品| 亚洲成人不卡| 日韩不卡在线| 成人精品天堂一区二区三区| 亚洲综合电影| caoporn视频在线| 国产成人精品一区二区三区视频| 国产一卡不卡| 国产情侣一区| 日韩成人精品一区二区三区| 伊人国产精品| 免费看日韩精品| 日韩中文字幕麻豆| 老鸭窝毛片一区二区三区| 香蕉久久精品| 久久人人88| 91久久国产| 99视频一区| 久久亚洲二区| 亚洲色图国产| 日韩欧美在线精品| 日韩av影院| 国产欧美日韩精品高清二区综合区| 久久精品97| 国产高清视频一区二区| 久久影院资源站| 国产91在线精品| 亚洲国产欧美日本视频| 日韩国产专区| 久久国产直播| 五月婷婷六月综合| 视频在线观看一区二区三区| 午夜在线视频观看日韩17c| 麻豆精品91| 亚洲精品黄色| 国产日韩欧美一区| 麻豆国产精品| 欧洲av不卡| 五月婷婷六月综合| 蜜桃久久av一区| 日韩欧美中文字幕一区二区三区| 欧美日韩在线精品一区二区三区激情综合| 欧美视频精品全部免费观看| 免费亚洲一区| 午夜影院一区| 91精品国产乱码久久久久久久| 国产综合色产| 一区二区三区午夜视频| 欧美在线看片| 日韩不卡一区| 欧美午夜不卡影院在线观看完整版免费| 美女精品网站| 久久wwww| 91精品啪在线观看国产18| 国产精品毛片在线看| 日韩黄色av| 国产精品成人一区二区不卡| 日韩精品诱惑一区?区三区| 亚洲精品在线观看91| 亚洲制服一区| 欧美国产极品| 亚洲大全视频| 国产欧美日本| 久久九九精品| 日本aⅴ精品一区二区三区| 国产一区福利| 国产精品毛片一区二区三区| 欧美日韩亚洲一区| 91看片一区| 日本一不卡视频| 日韩成人三级| 亚洲天堂免费| 福利片在线一区二区| 999在线观看精品免费不卡网站| 97精品久久| 色偷偷偷在线视频播放| 中文字幕中文字幕精品| 91一区二区三区四区| 免费成人在线影院| 国内一区二区三区| 国产一区导航| 国产一区二区三区久久 | 亚洲精品在线国产| av高清不卡| 日韩精品a在线观看91| 中文字幕系列一区| 日韩一区二区三区精品视频第3页 日韩一区二区三区免费视频 | 日本免费一区二区视频| 国产欧美日韩影院| 美女久久久久| 久久av网站| 欧美中文日韩| 精品视频黄色| 亚洲精一区二区三区| 亚洲黄色中文字幕| 日本伊人久久| 欧美日韩国产免费观看视频| 久久a爱视频| 综合日韩在线| 日韩啪啪电影网| 国产欧美精品久久| 在线精品小视频|