Xstate inspect状态图的使用 和 原理

状态图的好处之一是,在将状态图组合在一起的过程中,您可以探索流程中所有可能的状态。这种探索将帮助您避免代码中的错误和错误,因为您更有可能涵盖所有可能发生的情况。

因为状态图是可执行的,所以它们既可以表现为图,也可以表现为代码,这样就不太可能在图环境和编码环境之间引入差异或错误解释。

原理解析

状态图iframe展示页面是xstate官方提供的未开源,基本原理就是通过receptor监听发来的消息,进行状态图绘制。

xstate inspect检查器代理生成状态图:

Xstate提供俩中模式:postMessage或ws 。 进行inspect检查器和iframe内receptor的通讯

状态图页面是xstate官方提供的未开源,基本原理就是通过receptor监听发来的消息,进行状态图重新绘制。

Iframe中receptor接受到传来的序列化消息后,只用基本信息数据做状态图绘制和节点高亮,不涉及逻辑执行。逻辑执行还是由xstate中service执行,执行完转换state后传递state给状态图做高亮。点击状态图的事件节点也是触发service.send()方法让xstate执行send事件。

向iframe中发送消息:iframe.window.postMessage({ type: "xxx",    data: {} });        

监听postMessage的消息事件:window.addEventListener("message", (e) => {  console.log(e.data.type);    } });

一。postMessage模式:源码文件browser.ts

1.执行inspect()

1-1.执行inspect()创建了一个检查器inspector(如下inspect函数代码)。创建了一个InspectMachine,创建了一个devTools复制给全局变量:getGlobal().__xstate__ = devTools。

    InspectMachine监听响应的xstate.event等事件调用iframe.postMessage触发状态图的更新。 devTools维护listener(主要是代理service的send subsribe onStop)。)和service集合。

1-2.渲染iframe.src https://stately.ai/viz?inspect , 此iframe由xstate官方创建了receptor接受postMesage消息进行对应的视图重新渲染。同时会在receptor创建完成后向parent.window发出'xstate.inspect'消息,parent会将devTools.services全部发送给iframe进行'xstate.register'注册和初始化。

2.然后创建开启devTools的service,interpret(machine,{devTools:true});

2-1.开启了devTools的service start启动时会获取到devTools(getGlobal().__xstate__),

2-2.将service注册register到devTools中(注册时会执行listener(service),代理service的send subsribe onStop,同时会向InspectMachine发出'xstate.register'事件)。

之后service状态再改变,会自动走代理方法InspectMachine.send()触发iframe状态图更新。

二。Ws模式:源码文件server.ts

inspect(); //ws server端,接收iframe的消息,发送给inspectMachine处理(client.send发送事件到iframe中(通过ws send),进行状态机初始化 渲染状态图)

创建devTools,并注册listener对service进行代理,send subscribe stop时自动通过ws session 发送事件到iframe中。

渲染iframe src。

iframe中链接到inspect(ws server),作为client发送'xstate.inspecting'初始化完成事件,然后接受inspect发来的ws消息'xstate.register',进行注册状态机初始化 渲染状态图。

interpret(machine,{devTools:true}); 开启dev模式后,通过global.__xstate__将machine注册到devTools中(注册时会执行listener(machine),对machine进行代理,send subscribe stop时自动通过ws session 发送事件到iframe中的ws client端)。

Iframe中receptor接受到传来的序列化消息后,只用基本信息数据做状态图绘制和节点高亮,不涉及逻辑执行。逻辑执行还是由xstate中service执行,执行完转换state后传递state给状态图做高亮。点击状态图的事件节点也是触发service.send()方法让xstate执行send事件。

{     type: 'service.register',machine: stringifyMachine(service.machine),  // state: stringifyState(state),sessionId: service.sessionId,
}
{type: 'service.event',event: stringifyWithSerializer(state._event),sessionId: service.sessionId
}
{type: 'service.state',// TODO: investigate usage of structuredClone in browsers if availablestate: stringifyState(state, options?.serialize),sessionId: service.sessionId
}

通过inspect可视化绘制状态图

简单演示使用(在前端直接启动的状态机):  

 ps:正常还是建议在后端启动状态机

<template>
<iframe onload="this.height=document.body.scrollHeight-30" width="100%" scrolling="no" frameborder="0" data-xstate></iframe>
</template>
<script>
import { inspect } from "@xstate/inspect";async mounted() {
this.subMqtt();this.init(); // 此处为启动状态机逻辑: interpret(deviceMachine, {devTools:true}).start(); inspect({iframe: () => document.querySelector("iframe[data-xstate]"),});},
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3267411.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

K8s集群prometheus镜像配置非root用户执行导致监控页面targets无相关node信息监控

【问题描述】 K8s集群prometheus镜像配置非root用户执行导致监控页面targets无相关node信息监控 【问题记录】 在k8s容器集群来部署prometheus服务,实现对node节点的监控,但发现部署了prometheus后页面targets没有显示node信息,配置检查也是正确的 排查prometheus日志发现…

速递!OpenAI 凌晨发布 SearchGPT 进军 AI 搜索,正式与 Google、Perplexity 竞争

&#x1f431; 个人主页&#xff1a;TechCodeAI启航&#xff0c;公众号&#xff1a;TechCodeAI &#x1f64b;‍♂️ 作者简介&#xff1a;2020参加工作&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab; 优质专…

数据分析或处理中关于坐标系的一些事

通过对本文的阅读&#xff0c;你将获取坐标系的一些基础知识&#xff0c;以及学会如何使用pyproj实现地理数据的投影与转换。更重要的是&#xff0c;作为一个开发者&#xff0c;面对地理坐标系的图层数据&#xff0c;需要进行面积计算、距离量测、规则分块等需求时&#xff0c;…

成都哪一个新媒体产业园可以提供全方位的支持?全成都拥有最优质服务的园区在这!

成都市&#xff0c;作为中国西部的经济和文化中心&#xff0c;近年来在新媒体产业领域迅猛发展。众多新媒体产业园在这里拔地而起&#xff0c;为创新企业提供了丰富的资源和优质的服务。其中&#xff0c;位于成都金牛区的国际数字影像产业园尤为引人注目&#xff0c;作为园区运…

深入分析 Android ContentProvider (五)

文章目录 深入分析 Android ContentProvider (五)ContentProvider 的性能优化和实践案例1. 性能优化技巧1.1. 数据库索引优化示例&#xff1a;添加索引 1.2. 批量操作与事务管理示例&#xff1a;批量插入操作 1.3. 使用异步操作示例&#xff1a;使用 AsyncTask 进行异步查询 1.…

无人机图像目标检测技术详解

当前研究领域的热点之一。无人机搭载的高清摄像头能够实时捕获大量图像数据&#xff0c;对这些数据进行有效的目标检测对于军事侦察、环境监测、灾害救援等领域具有重要意义。本文将对无人机图像目标检测技术进行详解&#xff0c;包括图像处理技术、目标检测算法、关键技术应用…

通过IEC104转MQTT网关轻松接入阿里云平台

随着智能电网和物联网技术的飞速发展&#xff0c;电力系统中的传统IEC 104协议设备正面临向现代化、智能化转型的迫切需求。阿里云作为全球领先的云计算服务提供商&#xff0c;其强大的物联网平台为IEC 104设备的接入与数据处理提供了强大的支持。本文将深入探讨钡铼网关在MQTT…

springcloud接入seata管理分布式事务

下载安装包 链接: seata 配置seata-server 文件上传Linux解压 压缩包我放在/usr/local/seata中 tar -zxvf seata-server-2.0.0.tar.gz修改配置文件 设置nacos为注册和配置中心 进入文件夹 cd /usr/local/seata/seata/conf修改application.yml文件 ...... ...... cons…

Anaconda目录

安装目录 Anaconda 在默认情况下会安装到 C:\ProgramData\Anaconda3&#xff0c;而 conda 环境和包会安装在 C:\Users\username\.conda\ 目录下。 备注&#xff1a;我是在windows下安装 的Anaconda。我的安装目录是C:\Program Files\Anaconda3 pkgs目录 在以上两个目录下都有…

【React】组件:全面解析现代前端开发的基石

文章目录 一、什么是组件&#xff1f;二、组件的类型三、组件的生命周期四、状态管理五、属性传递六、组合与继承七、最佳实践 在现代前端开发中&#xff0c;React 已成为开发者构建用户界面的首选框架之一。React 的强大之处在于其组件化设计&#xff0c;允许开发者将 UI 拆分…

如何使用C#快速创建定时任务

原文链接&#xff1a;https://www.cnblogs.com/zhaotianff/p/17511040.html 使用Windows的计划任务功能可以创建定时任务。 使用schtasks.exe可以对计划任务进行管理&#xff0c;而不需要编写额外代码 这里掌握schtasks /CREATE 的几个核心参数就可以快速创建计划任务 /SC …

PGSQL学习-基础表结构

1 访问数据库 创建好数据库后&#xff0c;你可以有三种方式访问数据库 运行PostgreSQL的交互式终端程序&#xff0c;它被称为psql&#xff0c; 它允许你交互地输入、编辑和执行SQL命令。 使用一种已有的图形化前端工具&#xff0c;比如pgAdmin或者带ODBC或JDBC支持的办公套件…

云计算安全扩展要求解读

云计算简介&#xff1a; 一种全新网络服务方式&#xff0c;将传统的以桌面为核 心的任务处理转变为以网络为核心的任务处理&#xff0c; 利用互联网实现自己想要完成的一切处理任务&#xff0c; 使网络成为传递服务、计算力和信息的综合媒 介&#xff0c;真正实现按需计算、多…

高级及架构师高频面试题-基础型

1、设计模式有哪些原则&#xff08;待解释的更直白&#xff09; 单一职责原则&#xff1a;一个类或方法应只负责一项职责&#xff0c;避免一个类因为多个变化原因而改变。开闭原则&#xff1a;软件实体应对扩展开放&#xff0c;对修改封闭。比如要增加用户类别的时候可以新增一…

【C++】选择语句-多行if语句

语法格式 if(条件) {条件满足后执行的操作} else {条件不满足执行的操作} 下面是一个实例 #include<iostream> using namespace std;int main() {//选择结构 - 多行if语句//输入考试分数&#xff0c;如果考试分数大于600&#xff0c;视为考上一本大学&#xff0c;在屏…

C# dataGridView 去掉左边多出来空列

1.问题 在使用winform做界面程序时&#xff0c;dataGridView控件创建好后&#xff0c;左侧会多出一列为空&#xff0c;如何删除呢 2.解决方法 你可以在属性窗口中进行设置 如图&#xff1a; 将RowHeadersVisible 属性设置为False 或者代码设置 this.dataGridView1.RowHea…

登顶官方热榜,“超级智能体创造营”一期获奖名单公开!

自超级智能体创造营活动7月11日上线以来&#xff0c;受到很多平台开发者的关注&#xff0c;很开心看到首期创造营聚集了诸多优秀的平台开发者&#xff0c;共同参与到主题创作中&#xff0c;提交了100 的创意智能体&#xff01; 经过官方伙伴历经多轮、多维度的专业评审&#x…

HDU1032——The 3n + 1 problem,HDU1033——Edge,HDU1034——Candy Sharing Game

目录 HDU1032——The 3n 1 problem 题目描述 运行代码 代码思路 HDU1033——Edge 题目描述 运行代码 代码思路 HDU1034——Candy Sharing Game 题目描述 运行代码 代码思路 HDU1032——The 3n 1 problem 题目描述 Problem - 1032 运行代码 #include <iostr…

电量采集模块—应用于工厂车间配电室电网监测系统的搭建

前言 随着社会经济发展&#xff0c;工厂配电电网系统的供电实时监测越来越重要&#xff0c;这不仅是影响工厂安全性&#xff0c;更是工厂自动化的必然环节。工厂电力监测具有长时间在线工作的可靠性、较强的现场操作和与中心站的通讯功能&#xff0c;同时具有长时间记录存储数据…

HarmonyOS 请求相应HTTPS概览

1.HTTP概述 请求和响应 2.HTTP请求开发步骤 2.1.module.json5中添加 ohos.permission.INTERNET 2.2.导入http模块 2.3.创建htppt请求 2.4.发起请求 2.5.处理响应 2.6.销毁http对象 3.几个基本概念&#xff1a; 3.1.Webview&#xff1a;提供We…