Xstate inspect状态图的使用 和 原理

news2024/9/23 15:21:57

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

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

原理解析

状态图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 available
        state: 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://www.coloradmin.cn/o/1950465.html

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

相关文章

【YashanDB知识库】update/delete未选中行时,v$transaction视图没有事务,alter超时问题

问题现象 1、alter table修改表字段名&#xff0c;卡住&#xff0c;超时。 2、查看v$transaction事务视图&#xff0c;没有看到事务记录。 3、问题单&#xff1a;调整表结构时超时 问题风险及影响 无风险 问题影响版本 客户版本&#xff1a;22.2.8.3 问题发生原因 del…

2.1.卷积层

卷积 ​ 用MLP处理图片的问题&#xff1a;假设一张图片有12M像素&#xff0c;那么RGB图片就有36M元素&#xff0c;使用大小为100的单隐藏层&#xff0c;模型有3.6B元素&#xff0c;这个数量非常大。 识别模式的两个原则&#xff1a; 平移不变性&#xff08;translation inva…

MySQL学习(15):SQL优化:load、order by、group by

1.大批量插入数据指令load 当需要大批量插入数据时&#xff0c;insert的效率比较低&#xff0c;此时可以使用load命令 使用方法如下&#xff1a; &#xff08;1&#xff09;客户端连接服务端时&#xff0c;加上参数--local-infile mysql --local-infile -u root -p&#xf…

Java实现短信验证码服务

1.首先这里使用的是阿里云的短信服务。 package com.wzy.util;; import cn.hutool.captcha.generator.RandomGenerator; import com.aliyun.dysmsapi20170525.Client; import com.wzy.entity.Ali; import org.springframework.stereotype.Component;/*** Author: 顾安* Descri…

2024年铜川宜君半程马拉松,暴晒+爬坡152安全完赛

1、赛事背景 2024年7月21日&#xff0c;我参加了2024年铜川宜君半程马拉松赛&#xff0c;7月举办的赛事很少&#xff0c;全国都算温度比较高的&#xff0c;虽然宜君是一个山城&#xff0c;还是会担心气温会高。 临开赛1、2周&#xff0c;陕西区域降水比较多&#xff0c;赛前一…

C++从入门到起飞之——初始化列表类型转换static成员 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1、初始化列表 2、 类型转换 3. static成员 4、完结散花 1、初始化列表 • 之前我们实现构造函数…

在Linux中,部署及优化Tomcat

tomcat概述 自 2017 年 11月编程语言排行榜 Java 占比 13%,高居榜首&#xff0c;Tomcat 也一度成为 Java开发人员的首选。其开源、占用系统资源少、跨平台等特性深受广大程序员喜爱。本章主要学习如何部署 Tomcat 服务&#xff0c;根据生产环境实现多个虚拟主机的配置&#xf…

在el-table单元格中通过div绘制圆、直线和对角线

<el-table-column label"电源屏零层端子" align"center" prop"name2" width"220px"><template #default"scope"><div class"bigCircle"></div><div class"smallCircle">…

EtherNet/IP转Profinet协议网关(经典配置案例)

怎么样才能把EtherNet/IP和Profinet网络连接起来呢?这几天有几个朋友问到了这个问题&#xff0c;作者在这里统一为大家详细说明一下。其实有一个设备可以很轻松地解决这个问题&#xff0c;名为JM-PN-EIP&#xff0c;下面是详细介绍。 一&#xff0c;设备主要功能 1、捷米特J…

eqmx上读取数据处理以后添加到数据库中

目录 定义一些静态变量 定时器事件的处理器 订阅数据的执行器 处理json格式数据和将处理好的数据添加到数据库中 要求和最终效果 总结一下 定义一些静态变量 // 在这里都定义成全局的 一般都定义成静态的private static MqttClient mqttClient; // mqtt客户端 private s…

科研绘图系列:R语言组合堆积图(stacked barplot with multiple groups)

介绍 通常堆积图的X轴表示样本,样本可能会存在较多的分组信息,通过组合堆积图和样本标签分组信息,我们可以得到一张能展示更多信息的可发表图形。 加载R包 knitr::opts_chunk$set(warning = F, message = F) library(tidyverse) library(cowplot) library(patchwork)导入…

R包:plot1cell单细胞可视化包

介绍 plot1cell是用于单细胞数据seurat数据对象的可视化包。 安装 ## You might need to install the dependencies below if they are not available in your R library. bioc.packages <- c("biomaRt","GenomeInfoDb","EnsDb.Hsapiens.v86&qu…

基于飞腾FT2000的嵌入式计算机系统

作为中国嵌入式计算机的领导厂家&#xff0c;是最早进入轨道交通领域的 工业级AFC嵌入式计算机系列产品&#xff0c;充分体现了轨道交通新一代AFC主流新技术的各种特点&#xff0c;为轨道交通AFC系统的升级换代提供了良好的系统平台。 标准化 采用开放式架构的Intel新一代主流…

力扣高频SQL 50题(基础版)第八题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第八题1581. 进店却未进行过交易的顾客题目说明思路分析实现过程准备数据&#xff1a;实现方式&#xff1a;结果截图&#xff1a;总结&#xff1a; 力扣高频SQL 50题&#xff08;基础版&#xff09;第八题 1581. 进店…

操作系统杂项(十)

目录 一、简述socket中select、epoll的使用场景和区别 1、使用场景 2、区别 二、epoll水平触发和边缘触发的区别 三、简述Reactor和Proactor模式 1、Reactor 2、Proactor 3、区别 四、简述同步和异步的区别&#xff0c;阻塞和非阻塞的区别 1、同步与异步 2、阻塞与非…

SpringBoot入门:如何新建SpringBoot项目(保姆级教程)

在本文中&#xff0c;我们将演示如何新建一个基本的 Spring Boot 项目。写这篇文章的时候我还是很惊讶的&#xff0c;因为我发现有些java的初学者&#xff0c;甚至工作10年的老员工居然并不会新建一个SpringBoot项目&#xff0c;所以特别出了一篇文章来教大家新建一个SpringBoo…

状态机 XState 使用

状态机 一般指的是有限状态机&#xff08;Finite State Machine&#xff0c;FSM&#xff09;&#xff0c;又可以称为有限状态自动机&#xff08;Finite State Automation&#xff0c;FSA&#xff09;&#xff0c;简称状态机&#xff0c;它是一个数学模型&#xff0c;表示有限个…

Java链接elasticsearch8.14.1

项目需求&#xff0c;需要实现海量数据的聚合、查询。因为职业生涯开发使用springboot微服务架构、Java开发的方式&#xff0c;所以&#xff0c;项目前期准备了elasticsearch、kibana、logstash的集群环境&#xff0c;作为服务端&#xff0c;用于数据的收集、存储&#xff1b;但…

masscan 端口扫描——(Golang 简单使用总结)

1. 前言 最近要做一个扫描 ip 端口的功能 扫描的工具有很多&#xff0c;但是如何做到短时间扫描大量的 ip 是个相对困难的事情。 市场上比较出名的工具有 masscan和nmap masscan 支持异步扫描&#xff0c;对多线程的利用很好&#xff0c;同时仅仅支持 syn 半开扫描&#xff…

Emacs之解决无法输入中文问题(一百四十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…