如何自定义一个dataDispatcher,用于收束http和websoket

简介: 【10月更文挑战第17天】如何自定义一个dataDispatcher,用于收束http和websoket

作用

封装http和websoket,返回相同结构的数据

快速使用

核心代码

边缘端走websoket,云端走http轮询的调用方法

// 引入这个插件
import dataDispatcher from '@/utils/dataDispatcher';
import http from './utils/http';
// 获取数据派发器
const dispatcher = dataDispatcher();
// request请求数据 -> (request第一个参数是ws链接,第二个参数是http回调函数)
// response监听响应的数据 -> 内部会做边缘端或云端判断,云端走http轮询(每30s),边缘端走websocket
// websocket自动发送心跳数据、支持断网自动重连;request第三个参数是http的轮询时间,默认 30 * 1000 ms,传0只请求一次,不轮询
dispatcher
    .request('ws://localhost:3200', () => http.post('/api/test1'))
    .response(res => {
        console.log('res: ', res);
    });
// [可选]---------------创建第二个数据监听回调(设置云端http请求轮询时间为10s)
const observe = dispatcher.request('ws://localhost:3200', () => http.post('/api/test2'), 10 * 1000);
// 监听数据响应
observe.response(data => {
  // 返回的数据
  console.log('data: ', data);
  // 边缘端数据处理
  if(dispatcher.isEdge){
    // 云端数据处理
  }esle{
    
  }
});
onBeforeUnmount(() => {
    // [可选]注销数据监听器(边缘端关闭ws链接,云端关闭http轮询)
    observe.dispose();
});

只走http轮询的用法

// 引入这个插件
import dataDispatcher from '@/utils/dataDispatcher';
import http from './utils/http';
// 获取数据派发器
const dispatcher = dataDispatcher();
// pollingHttp启用轮询 -> (第一个参数是http函数,第二个参数是轮询时间)
// response监听响应的数据  
dispatcher
    .pollingHttp('() => http.post('/api/test1'),15*1000*60)
    .response(res => {
        console.log('res: ', res);
    });
// [可选]---------------注销轮询
const observe = dispatcher.pollingHttp(() => http.post('/api/test2'), 10 * 1000);
// 监听数据响应
observe.response(data => {
    // 返回的数据
    console.log('data: ', data);
});
onBeforeUnmount(() => {
    // [可选]注销轮询及数据监听器
    observe.dispose();
});

只需要使用websokect

import WebSocketClient from "@/utils/dataDispatcher/WebSocketClient"
const ws = new WebSocketClient('ws://localhost:3200');
// 连接
ws.connect()
// 同原生方法
ws.onclose(()=>{})
// 同原生方法
ws.onerror(()=>{})
// 同原生方法
ws.onmessage(()=>{
  // 同原生方法
  ws.send("自定义发送的数据")
})
// 同原生方法
ws.onopen(()=>{})
// 关闭连接
ws.close()

其他用法

以下示例基于边缘端走websoket,云端走http的情况

边远端如何先请求http,在走websokec

//边远端如何先请求http,在进行ws长连接
// 先模拟当前环境为边缘端[注意:不要改变isEdge的值,会影响所有的dispatcher实例.本代码仅测试用]
dispatcher.isEdge = true;
const app = dispatcher.request('ws://localhost:3200', () => http.post('/api/test2'));
// originHttp是 () => http.post('/api/test2') 的浅copy对象
app.originHttp().then(res => {
    if (res) {
        app.response(data => {
            console.log('data: ', data);
        });
    }
});

http轮询的更多控制

// http轮询的更多控制
const httpApp = dispatcher.request('ws://localhost:3200', () => http.post('/api/test2'));
httpApp.response(res => {
    console.log('res: ', res);
});
// 手动触发一次接口 -> 会终止云端的默认轮询行为(边缘端也会触发此接口!)
//(response方法会监听到响应值,因此不要在response内调用此方法!避免循环回调)
// [注]边缘端不会触发rePlayHttp
httpApp.rePlayHttp();
// 以3000ms的间隔开始轮询次此接口
httpApp.rePlayHttp(3000);
//更改此接口的入参(不会终止轮询)
httpApp.rePlayHttp(() => http.post('/api/test1', { a: '1' }));
//更改监听的接口,并重设轮询时间
httpApp.rePlayHttp(() => http.post('/api/test2', { name: '1' }), 20 * 1000);

更底层的websokect控制

const observe = dispatcher.request('ws://localhost:3200', () => http.post('http://xxxx'));
// [可选]-------------更底层的websokect控制
// 连接
observe.ws.connect()
// 同原生方法
observe.ws.onclose(()=>{})
// 同原生方法
observe.ws.onerror(()=>{})
// 同原生方法
observe.ws.onmessage(()=>{
  // 同原生方法
  observe.ws.send("自定义发送的数据")
})
// 同原生方法
observe.ws.onopen(()=>{})
// 关闭连接
observe.ws.close()

非边缘端如何进行websocket测试?

// 引入这个插件
import dataDispatcher from '@/utils/dataDispatcher';
// 创建数据派发器
const dispatcher = dataDispatcher();
//设置为边缘端环境(启用websoket)
dispatcher.isEdge = true

控制台会有提示

如何关闭websoket提示?

控制台的提示只会在开发环境出现,开发环境禁用,给dataDispatcher传true即可

// 引入这个插件
import dataDispatcher from '@/utils/dataDispatcher';
// 创建数据派发器
const dispatcher = dataDispatcher(true);
//设置为边缘端环境(启用websoket)
dispatcher.isEdge = true

sendData

sendData是与request相似的一个方法,其内部不会做websoket和http合并处理,你传什么值,返回什么值

const observe = dispatcher.sendData("11111111");
observe.response(res => {
    console.log('res---: ', res); // 11111111
});

sendData也可以是一个用于return 的异步函数

const observe = dispatcher.sendData(() => {
    return new Promise((resolve, reject) => {
        // 模拟异步请求延迟
        setTimeout(() => {
            resolve({ data: 'Response data' });
        }, 1000); // 模拟延迟 1 秒
    });
});
observe.response(res => {
    console.log('res---: ', res); // Response data
});
相关文章
|
15天前
|
消息中间件 测试技术
通过轻量消息队列(原MNS)主题HTTP订阅+ARMS实现自定义数据多渠道告警
轻量消息队列(原MNS)以其简单队列模型、轻量化协议及按量后付费模式,成为阿里云产品间消息传输首选。本文通过创建主题、订阅、配置告警集成等步骤,展示了该产品在实际应用中的部分功能,确保消息的可靠传输。
38 2
|
4月前
|
运维 Serverless 调度
函数计算产品使用问题之怎么在HTTP触发的函数里添加或读取自定义头部
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
5月前
|
JSON 应用服务中间件 开发工具
Ngnix的http块自定义服务日志,access.log和error.log,log_format指定日志输出格式设置
Ngnix的http块自定义服务日志,access.log和error.log,log_format指定日志输出格式设置
|
测试技术 Go
【测试平台系列】第一章手撸压力机(二)自定义http客户端配置
上一节简单实现了http发送get请求的客户端,但是在实际工作中,我们会对客户端有各种的设置,也会有各种的请求。
【测试平台系列】第一章手撸压力机(二)自定义http客户端配置
|
测试技术
【测试平台系列】第一章手撸压力机(三)自定义http请求
今天继续深入往下讲,上一篇咱们对http的客户端设置进行了结构化统一,现在咱们开始对http请求进行结构化统一,首先咱们梳理http请求包含的结构。
|
域名解析 存储 缓存
网络基础之应用层协议,组织方式,自定义协议和http协议https协议简单介绍(2)
我们在之前的文章里讲过,应用层是应用在各个程序之间的数据沟通,其实应用层协议是面向程序员的,因为这些协议都是程序员写的,是方便程序员在编写程序时完成各个应用程序之间的沟通
117 0
网络基础之应用层协议,组织方式,自定义协议和http协议https协议简单介绍(2)
|
JSON 移动开发 网络协议
网络基础之应用层协议,组织方式,自定义协议和http协议https协议简单介绍(1)
我们在之前的文章里讲过,应用层是应用在各个程序之间的数据沟通,其实应用层协议是面向程序员的,因为这些协议都是程序员写的,是方便程序员在编写程序时完成各个应用程序之间的沟通
156 0
网络基础之应用层协议,组织方式,自定义协议和http协议https协议简单介绍(1)
|
Serverless
在函数计算中实现定时触发自定义环境中的 HTTP 函数
在函数计算中实现定时触发自定义环境中的 HTTP 函数
99 0
|
中间件 Go 网络架构
Go Web 编程入门:HTTP 自定义路由
Go 语言提供功能丰富的 net/http,实现了基础的 HTTP 中的 client 和 server 功能。在这一篇文章也有介绍一个基础的 HelloWorld 应用。
Go Web 编程入门:HTTP 自定义路由
|
前端开发 Python
ElementUI上传组件el-upload自定义http-request上传到Flask服务
ElementUI上传组件el-upload自定义http-request上传到Flask服务
585 0
ElementUI上传组件el-upload自定义http-request上传到Flask服务