iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >用vue设计一个数据采集器
  • 619
分享到

用vue设计一个数据采集器

2024-04-02 19:04:59 619人浏览 八月长安
摘要

目录场景核心问题状态监听状态监听优势状态监听劣势重构实现思路依赖收集总结场景 在业务上现在有一个场景,当发生业务行为变化时,需要对各个模块的行为进行数据收集,数据用途可以用作回顾,

场景

在业务上现在有一个场景,当发生业务行为变化时,需要对各个模块的行为进行数据收集,数据用途可以用作回顾,也可以是例如监控这样的场景。

核心问题

说白了这个需求就是需要对各个模块状态变更进行记录,然后再格式化上传到服务端。
解题思路有两种一种是状态监听,第二主动收集。

状态监听

状态监听优势

快速实现利用状态管理和wacth的机制很快就知道不同模块的状态变更,然后就可以获取数据,再格式化数据,发送给服务端

状态监听劣势

  • wacth的重复监听,只要使用了wacth,不管是不是你所需要的数据,只要状态变更就会触发改变,监听行为
  • 重复依赖,比如说全局有个开始结束的状态,在使用wacth的时候就需要在不同的wacth中都去判断这个状态,或者有全局的时间模块等等
  • 重复书写,在不同的监听中需要实践相同的数据格式化方法
  • 数据分布混乱,虽然控制了全局使用同一管道上传,但是对于同一个管道内的数据想做合并去重,或者其他自定义的操作,在不同类型数据,同一管道的这个场景下面支持很弱
  • 场景区分困难,正常流程触发的监听是没有问题,如果是异常场景触发恢复的监听就会导致判断的复杂性
  • 描述的还是比较抽象看下代码示例

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(){
 // 重复监听
 wacth(new,old){
 // 全局判断
  if(start){
    // 不同状态判断
    if(new.type =='need')
     const b = {
      b:new.b
     }
     //重复数据格式
     const aa = {
      b:new.aa
     }
     upload(b)
     upload(aa)
  }
 }
}

重构实现思路

  • 依赖收集(监听者模式)
  • 状态统一
  • 数据自治(策略模式)

依赖收集

  • 核心思想:希望使用同一个采集器解决整个业务流程,数据变更在各个变更方,通过采集器提供的标准的格式化方法去处理数据,再把数据传递到采集器,采集器收到数据后根据不同的数据格式插入到不同的缓存通道,缓存通道缓存成功,通知业务处理的监听者,根据不同的数据类型进行不同的处理方式,最后发送到服务端。
  • 具体代码如下



class Dep {
  private subs: any = []
  // 添加观察者
  public addSub(sub: any) {
    if (sub && sub.update) {
      this.subs.push(sub)
    }
  }
  // 发送通知
  public notify(content: any) {
    this.subs.forEach((sub: any) => {
      sub.update(content)
    })
  }
}

class Watcher {
  private cb!: (arg: any) => void
  constructor(cb: (arg: any) => void) {
    // 回调函数负责更新
    this.cb = cb
  }
  // 当数据发生变化的时候更新
  update(content: any) {
    this.cb(content)
  }
}

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
  }
  
  push(item: any) {
    // 如果超出限制尺寸移除第一个
    if (this.limitSize == this.queue.length) {
      this.queue.shift()
    }
    this.queue.push(item)
  }
  
  getLast() {
    if (this.queue.length > 0) {
      return this.queue[this.queue.length - 1]
    } else {
      throw new Error('no item return')
    }
  }
  
  getLastIndex(index: number) {
    try {
      return this.queue[this.queue.length - index - 1]
    } catch (error) {
      throw new Error('no item return')
    }
  }
  
  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()
  }
  
  private intWatcher() {
    this.dep.addSub(
      new Watcher((type: NotifyType) => {
        const handlerBack = this.getHandler(type)
        handlerBack()
      }),
    )
  }
  
  private initChannel() {
    this.dataQueue.forEach(item => {
      this.channelMap.set(item, new Channel(item, 3))
    })
  }
  
  private initData() {
    
  }
  
  private initMQ() {

  }
  
  public getMQ() {
    return this.MQ
  }
  
  private getChannel(name: NotifyType) {
    if (this.channelMap.get(name)) {
      return this.channelMap.get(name)
    } else {
      throw new Error('no channel')
    }
  }
  
  public notify(type: NotifyType, mes: any) {
    // 设置管道缓存
    this.setChannel(type, mes)
    // 全局统一判断状态判断是否要分发数据
    if (state.value.type) {
      this.dep.notify(type)
    }
  }
  
  private setChannel(name: NotifyType, mes: any) {
    const channel = this.getChannel(name)
    channel.push(mes)
  }
  
  private getHandler(name: NotifyType) {
    return this.strategies[name]
  }
  
  public getChannelLast(name: NotifyType) {
    try {
      const channel = this.getChannel(name)
      return channel.getLast()
    } catch (error) {
      throw new Error(error)
    }
  }
  
  public getChannelItemByLastIndex(name: NotifyType, index: number) {
    try {
      const channel = this.getChannel(name)
      return channel.getLastIndex(index)
    } catch (error) {
      throw new Error(error)
    }
  }
  
  public generateA() {
    
  }
  
  public generateB() {
    
  }
  
  public generateC() {
    
  }
}

export const CollectionHelper = new Collection()

总结

  • 我觉得去了解一个框架的一个好的思路就是在运用它的核心原理去解决一个原理,正如之前使用webpack插件机制一样,这次使用的是Vue的依赖收集
  • 状态自治,职责统一是个代码封装的好习惯

以上就是用vue设计一个数据采集器的详细内容,更多关于vue 设计数据采集器的资料请关注编程网其它相关文章!

--结束END--

本文标题: 用vue设计一个数据采集器

本文链接: https://www.lsjlt.com/news/124482.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 用vue设计一个数据采集器
    目录场景核心问题状态监听状态监听优势状态监听劣势重构实现思路依赖收集总结场景 在业务上现在有一个场景,当发生业务行为变化时,需要对各个模块的行为进行数据收集,数据用途可以用作回顾,...
    99+
    2024-04-02
  • php实现的一个很好用HTML解析器类可用于采集数据
    复制代码 代码如下:<php    $oldSetting = libxml_use_internal_errors( true ); ...
    99+
    2022-11-15
    HTML解析器
  • Python+Selenium实现一键摸鱼&采集数据
    目录前言应用场景代码一键摸鱼(打开多个网页编写bat一键数据采集前言 将Selenium程序编写为 .bat 可执行文件,从此一键启动封装好的Selenium程序,省时省力还可以复用...
    99+
    2024-04-02
  • 简数采集器数据发布到PHPCMS
    简数采集器支持将采集数据自动批量发布到PHPCMS系统。使用步骤如下: 目录 1. 安装PHPCMS发布插件(在PHPCMS后台上传安装) 2. 创建发送目标 (在简数系统控制台) 3. 采集数据发布到PHPCMS 1. 安装PHPCM...
    99+
    2023-09-14
    经验分享 大数据 内容运营 爬虫 php
  • 简数采集器数据发布到PHPWind
    简数采集器支持采集数据自动批量发布到PHPWind CMS系统。使用步骤如下: 1. 安装PHPWind发布插件(在PHPWind后台安装)          1)下载PHPWind采集发布插件下载地址:            PHPWi...
    99+
    2023-10-10
    大数据 爬虫 经验分享 内容运营 php
  • 如何设置阿里云数据库采集数据时间
    阿里云数据库是阿里云提供的一种高性能、高可用的数据库服务,它可以满足不同业务场景下的数据存储和处理需求。然而,为了保证数据的准确性和完整性,我们需要设置阿里云数据库采集数据的时间。本文将详细说明如何设置阿里云数据库采集数据时间。 一、如何设...
    99+
    2023-10-29
    阿里 如何设置 数据库
  • 简洁短小:php数据采集利器
    作为一名网络开发者,我经常需要从网页上获取数据并进行处理。而在这个过程中,PHP采集网页数据成为了我最常用的工具之一。今天,我将对比评测两种常见的php采集网页数据的方式:使用curl库和使用file_get_contents函数。 1.介...
    99+
    2023-10-26
    函数 请求
  • 数据采集要用到代理IP吗
    这篇文章主要介绍“数据采集要用到代理IP吗”,在日常操作中,相信很多人在数据采集要用到代理IP吗问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”数据采集要用到代理IP吗”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-25
  • 一文详解WebAudio浏览器采集麦克风音频数据
    目录背景实现思路获取麦克风权限,录制声音利用Web Audio Api 处理音频流数据实时获取音频数据,绘制波形图背景 关于Web Audio,上一篇小编介绍了下,如何通过解析音频...
    99+
    2023-03-09
    Web Audio采集音频数据 Web Audio浏览器采集
  • Qt数据库应用之实现通用数据库采集
    目录一、前言二、功能特点三、体验地址四、效果图五、相关代码一、前言 数据库采集对应的就是上一篇文章的数据库同步,数据库同步到云端数据库以后,app、网页、小程序啥的要数据的话,可以通...
    99+
    2024-04-02
  • 凌犀物联工业设备数据采集的意义
    工业设备数据采集是任何行业数据透明,智慧工厂、数据透明工厂的基础,现在已经进入大数据时代,无论是我们息息相关的购物,出行甚至在工业领域也开启了大数据物联网,因此,我们队数据控制正确,分析准确,就可以很好地预测控制市场,对企业成长至关重要。制...
    99+
    2023-06-02
  • 阿里云服务器采集工业数据
    简介 随着工业4.0时代的到来,制造业企业对于数据的需求越来越高。而阿里云作为国内领先的云计算服务提供商,其服务器技术在工业数据采集方面有着独特的优势。本文将介绍阿里云服务器如何应用于工业数据采集,并探讨其对制造业数字化转型的影响。详细说明...
    99+
    2023-12-29
    阿里 服务器 工业
  • 如何用Python采集腾讯招聘数据
    这篇文章将为大家详细讲解有关如何用Python采集腾讯招聘数据,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。今天我们爬取腾讯招聘网站Python岗位的招聘信息。如图所示:然后还是先看一下最终...
    99+
    2023-06-15
  • 怎么用Python采集整站表格数据
    这篇文章主要讲解了“怎么用Python采集整站表格数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python采集整站表格数据”吧!目标分析大师兄给我的网址是这个:https://w...
    99+
    2023-06-16
  • Java网页数据采集器如何进行数据存储
    Java网页数据采集器如何进行数据存储,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。简介:作为全球运用最广泛的语言,Java 凭借它的高效性,可移植性(跨平台),代码的健壮...
    99+
    2023-06-17
  • PHP与数据库设计的集成
    随着互联网技术的不断发展,PHP作为一种服务器端脚本语言在网站开发中得到广泛应用。作为一种开源语言,PHP有着成熟的框架和庞大的社区支持。当然,PHP与数据库的结合也是非常紧密的。在PHP网站开发过程中,数据库设计是必不可少的一步。数据库设...
    99+
    2023-05-15
    集成 PHP 数据库设计
  • 教你用python和php写一个随机user_agent,突破反爬,实现数据大量采集
    python生成一个随机的user_agent # -*- coding: utf-8 -*- import random dd = {} list1 = ['100.0.4896.20', '100.0.4896.60', '101.0....
    99+
    2023-09-01
    php 开发语言 python
  • vue如何设计一个倒计时秒杀的组件
    这篇文章将为大家详细讲解有关vue如何设计一个倒计时秒杀的组件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。简介:倒计时秒杀组件在电商网站中层出不穷  不过思路...
    99+
    2024-04-02
  • Prometheus系统的数据采集器如何工作
    Prometheus系统的数据采集器通过展示和存储监控数据来帮助用户了解系统的性能和健康状况。它工作的基本原理如下: 数据源:P...
    99+
    2024-03-04
    Prometheus
  • PHP使用三种方法实现数据采集
    目录什么叫采集?PHP制作采集的技术1. 使用socket技术采集:2. 使用curl_一套函数3. 直接使用file_get_contents(最顶层的)3种方...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作