JavaScript与有限状态机

JavaScript中有限状态机的实现——Promise 在handle方法中,我们根据Promise的当前状态执行相应的回调函数。如果Promise的状态为已拒绝,则调用onRejected回调函数,并将拒绝的原因作为参数传递给它。当异步操作失败时,我们调用reject函数将Promise的状态设置为已拒绝,并传递一个拒绝的原因。在then方法中,我们创建一个新的Promise实例,并在内部的处理程序中执行onFulfilled和onRejected回调函数。如果在读取文件时发生错误,则Promise的状态将变为已拒绝,并触发catch方法注册的回调函数。 阅读详情

JavaScript与有限状态机

作者: 阮一峰

日期: 2013年9月 2日

有限状态机(Finite-state machine)是一个非常有用的模型,可以模拟世界上大部分事物。

简单说,它有三个特征:

  * 状态总数(state)是有限的。
  * 任一时刻,只处在一种状态之中。
  * 某种条件下,会从一种状态转变(transition)到另一种状态。

它对JavaScript的意义在于,很多对象可以写成有限状态机。

举例来说,网页上有一个菜单元素。鼠标悬停的时候,菜单显示;鼠标移开的时候,菜单隐藏。如果使用有限状态机描述,就是这个菜单只有两种状态(显示和隐藏),鼠标会引发状态转变。

代码可以写成下面这样:


  var menu = {
      
    // 当前状态
    currentState: 'hide',
  
    // 绑定事件
    initialize: function() {
      var self = this;
      self.on("hover", self.transition);
    },
  
    // 状态转换
    transition: function(event){
      switch(this.currentState) {
        case "hide":
          this.currentState = 'show';
          doSomething();
          break;
        case "show":
          this.currentState = 'hide';
          doSomething();
          break;
        default:
          console.log('Invalid State!');
          break;
      }
    }
  
  };
  

可以看到,有限状态机的写法,逻辑清晰,表达力强,有利于封装事件。一个对象的状态越多、发生的事件越多,就越适合采用有限状态机的写法。

另外,JavaScript语言是一种异步操作特别多的语言,常用的解决方法是指定回调函数,但这样会造成代码结构混乱、难以测试和除错等问题。有限状态机提供了更好的办法:把异步操作与对象的状态改变挂钩,当异步操作结束的时候,发生相应的状态改变,由此再触发其他操作。这要比回调函数、事件监听、发布/订阅等解决方案,在逻辑上更合理,更易于降低代码的复杂度。

下面介绍一个有限状态机的函数库Javascript Finite State Machine。这个库非常好懂,可以帮助我们加深理解,而且功能一点都不弱。

该库提供一个全局对象StateMachine,使用该对象的create方法,可以生成有限状态机的实例。


  var fsm = StateMachine.create();
  

生成的时候,需要提供一个参数对象,用来描述实例的性质。比如,交通信号灯(红绿灯)可以这样描述:


  var fsm = StateMachine.create({
  
    initial: 'green',
  
    events: [
      { name: 'warn',  from: 'green',  to: 'yellow' },
      { name: 'stop', from: 'yellow', to: 'red' },
      { name: 'ready',  from: 'red',    to: 'yellow' },
      { name: 'go', from: 'yellow', to: 'green' }
    ]
  
  });
  

交通信号灯的初始状态(initial)为green,events属性是触发状态改变的各种事件,比如warn事件使得green状态变成yellow状态,stop事件使得yellow状态变成red状态等等。

生成实例以后,就可以随时查询当前状态。

* fsm.current :返回当前状态。
* fsm.is(s) :返回一个布尔值,表示状态s是否为当前状态。
* fsm.can(e) :返回一个布尔值,表示事件e是否能在当前状态触发。
* fsm.cannot(e) :返回一个布尔值,表示事件e是否不能在当前状态触发。

Javascript Finite State Machine允许为每个事件指定两个回调函数,以warn事件为例:

* onbeforewarn:在warn事件发生之前触发。
* onafterwarn(可简写成onwarn) :在warn事件发生之后触发。

同时,它也允许为每个状态指定两个回调函数,以green状态为例:

* onleavegreen :在离开green状态时触发。
* onentergreen(可简写成ongreen) :在进入green状态时触发。

假定warn事件使得状态从green变为yellow,上面四类回调函数的发生顺序如下:onbeforewarn → onleavegreen → onenteryellow → onafterwarn。

除了为每个事件和状态单独指定回调函数,还可以为所有的事件和状态指定通用的回调函数。

* onbeforeevent :任一事件发生之前触发。
* onleavestate :离开任一状态时触发。
* onenterstate :进入任一状态时触发。
* onafterevent :任一事件结束后触发。

如果事件的回调函数里面有异步操作(比如与服务器进行Ajax通信),这时我们可能希望等到异步操作结束,再发生状态改变。这就要用到transition方法。


  fsm.onleavegreen = function(){
    light.fadeOut('slow', function() {
      fsm.transition();
    });
    return StateMachine.ASYNC;
  };
  

上面代码的回调函数里面,有一个异步操作(light.fadeOut)。如果不希望状态立即改变,就要让回调函数返回StateMachine.ASYNC,表示状态暂时不改变;等到异步操作结束,再调用transition方法,使得状态发生改变。

Javascript Finite State Machine还允许指定错误处理函数,当发生了当前状态不可能发生的事件时自动触发。


  var fsm = StateMachine.create({
    // ...
    error: function(eventName, from, to, args, errorCode, errorMessage) {
      return 'event ' + eventName + ': ' + errorMessage;
    },
    // ... 
  });
  

比如,当前状态是green,理论上这时只可能发生warn事件。要是这时发生了stop事件,就会触发上面的错误处理函数。

Javascript Finite State Machine的基本用法就是上面这些,更详细的介绍可以参见它的主页。

(完)

chine:用于在 Node.js 中构建复杂异步进程的有限状态机路由器 Chine:一个有限状态机执行引擎 Chine(发音为“sheen”)允许您将任务拆分为多个步骤,这些步骤可以由有限状态机 (fsm) 异步执行。 机器可以按确定性但任意复杂的顺序执行。 例子 这是一个要求输入用户名的简单示例(只有几十行左右没有注释): var readline = require ( 'readline' ) ; var Chine = require ( './lib' ) ; // Create a new state machine var fsm = new Chine ( 'initial' ) ; // Define the initial state. This will be our // starting point. fsm . state ( function ( ) { // Assign a name this . name 立即下载

相关推荐

automa.js:实现有限状态机的 JavaScript 库

automa.js 实现有限状态机的 JavaScript 库 您可以轻松定义状态和事件,例如 STATE = { S1 : "State 1", S2 : "State 2" }; EVENT = { E1 : "Event 1", E2 : "Event 2" }; 然后通过声明初始状态(又名入口点)来实例化一个新的状态机 var automa = AUTOMA.automa(STATE.S1); 之后,您可以轻松地对各种过渡进行编程 var executed1 = false; var executed2 = false; automa.from(STATE.S1).goTo(STATE.S2).when(EVENT.E1).andDo(function() { executed1 = true; }); automa.stayOn(STATE

基于有限状态机开发健壮的Nodejs/TCP客户端

`FlexState`是一款简单易用的有限状态机,本文介绍如何基于有限状态机来开发一款键壮的TCP客户端

Fisher的专栏 1156

gawati-workflow:Node JS的有限状态机工作流模块

Gawati工作流程 XML和JSON支持工作流配置,可以使用XML创建工作流配置,然后将其转换为JSON以供应用程序使用。 您可以根据以下说明生成Worfklow的有向图(要求Workflow配置为XML)。 Gawati工作流是一个有状态的工作流,旨在支持通过状态转换在不同状态下移动文档。 工作流允许定义谁可以在每个状态下执行操作,以及允许谁在状态之间进行转换。 过渡连接状态,并允许仅使用少数几个状态来构建复杂的工作流。 典型的过程是使用XML提供的xml2jon脚本,以XML编辑工作流并从生产JSON中生成生产JSON。 测试 npm install然后是; npm test 单元测试位于test/testWorkflow.js ,它提供了有关如何使用API​​的概述。 产生文件 注意:这要求工作流配置必须为XML格式 npm install在package文件夹中 下载

【框架 - Nodejs中的有限状态机】

有限状态机,finite state machine 缩写FSM ,一种数学模型和计算机科学概念,用于描述对象在计算过程中的状态转换。它由一组状态、一组可触发的事件以及状态转移规则组成。如图,便是一个典型的有限状态机。在一个交通灯控制系统中,状态:绿灯、黄灯、红灯就是三个可能的状态。事件:定时器触发的“时间到了”可以是一个事件。转移规则:从绿灯到黄灯的转移规则可以是,当定时器触发 “时间到了”事件,绿灯转移到黄灯。

qq_38428433的博客 1254

Unity3d SECTR 2019 从零开始了解(零)

插件刚下载下来,虽然从Demo里面看了下大致效果,但尝试使用的时候茫无头绪,因此决定一边读文档一边写下笔记。这个笔记会从最基本的名词概述开始一步一步到用法。 除非特别注明,所有内容都不是机翻,而是理解后自己翻译的。 翻译内容: 【零】API REFERENCE MANUAL第一章Documentation Core Concept 【一】 名词概述 CORE CORE是SECTR的核心,一个快速将 Sectors 和 Portals 加入到Unity中的工具,以及完整的源代码,可以构筑独特的功能。 VI

狗蛋在土里瑟瑟发抖 1501

STM32F103C8T6+TB6612驱动直流电机全攻略(附PWM调速代码)

本文提供了一份基于STM32F103C8T6微控制器和TB6612驱动模块的直流电机驱动完整解决方案。详细解析了硬件连接、STM32CubeMX配置、HAL库驱动代码编写,并附带了PWM调速代码实现。内容涵盖从基础原理到实战调试的全过程,旨在帮助开发者快速构建稳定、可精准调速的电机控制系统,适用于智能车、机器人等嵌入式项目。

weixin_29181861的博客 586

Erlang/Elixir: 有限状态机原理笔记

OTP 原理 有限状态机被描述为如下形式的一组关系集合. 含义可以解释为:如果在状态S的时候发生了事件E, 那么执行动作A并且使状态S过渡( transition )到状态S'. 对于使用 gen_fsm 行为的有限状态机来说, 状态过渡规则被实现为一些 Erlang 函数, 他们遵循如下的约定: StateName(Event, St...

weixin_33910385的博客 476

告别版本冲突!在Ubuntu 20.04上优雅实现ROS Noetic与ROS2 Foxy双环境切换

本文详细介绍了在Ubuntu 20.04系统上实现ROS Noetic(ROS1)与ROS2 Foxy双环境共存与切换的完整方案。通过智能脚本设计和工作空间隔离,解决了版本冲突问题,帮助开发者高效管理不同ROS版本项目。特别适合需要同时开发ROS1和ROS2应用的机器人开发者。

weixin_28452161的博客 411

Hermes 仓库中的 TypeScript Raytracer:源码结构、编译运行与基准测试实践

本指南以 [benchmarks/raytracer/original/README.md](https://link.gitcode.com/i/256d9e24d85beef6e3bab5a5dda7f170) 为核心,详解 Hermes 仓库中这一经典 TypeScript 光线追踪示例的实现原理、`tsc` 编译与 HTML 运行流程,并延伸到 Hermes 基准测试场景:如何将其改造成可

gitblog_00106的博客 427

DCM、PLL以及DLL等概念及详情

介绍DLL、PLL以及DCM的概念,总结其模块构成、工作原理、相互之间的差异与各自优势。

CLL_caicai的博客 8338

一文读懂「Chain of Thought,CoT」思维链

Chain-of-Thought(CoT)是一种改进的Prompt技术,目的在于提升大模型LLMs在复杂推理任务上的表现,对于复杂问题尤其是复杂的数学题大模型很难直接给出正确答案。如算术推理(arithmetic reasoning)、常识推理(commonsense reasoning)、符号推理(symbolic reasoning)。COT通过要求模型在输出最终答案之前,显式输出中间逐步的推理步骤这一方法来增强大模型的算数、常识和推理能力。简单,但有效。2022 年,在 Google 发布的论文。

女王の专属领地 4万+

JavaScript高级语法之有限状态机

有限状态机的概述 有限状态机(Finite-state machine)是一个非常有用的模型,可以模拟世界上大部分事物。 简单说,它有三个特征: 状态总数(state)是有限的。 任一时刻,只处在一种状态之中。 某种条件下,会从一种状态转变(transition)到另一种状态。 它对JavaScript的意义在于,很多对象可以写成有限状态机。 举例来说:网页上有一个菜单元素。鼠标点击,...

上善若泪 1621

具身智能(40):主流 VLA 模型π₀

摘要: π₀是首款专为机器人设计的VLA(视觉-语言-动作)端到端基础模型,通过双阶段训练实现“感知-决策-执行”闭环。其创新点包括:1)FlowMatching技术实现连续平滑动作控制(精度0.3°);2)结合VLM预训练与多机器人实操数据,零样本任务完成率达76.4%,远超同类模型;3)支持模糊指令理解与动态场景适应(如遮挡识别)。开源版本涵盖不同规模模型,适用于工业装配、服务机器人等场景,在延迟(213ms)和稳定性(92%自主恢复率)上显著领先OpenVLA等竞品。

码农17年的博客 510

Javascript之有限状态机

有限状态机(Finite-state machine)是一个非常有用的模型,可以模拟世界上大部分事物。 简单说,它有三个特征: * 状态总数(state)是有限的。   * 任一时刻,只处在一种状态之中。   * 某种条件下,会从一种状态转变(transition)到另一种状态。 它对JavaScript的意义在于,很多对象可以写成有限状态机。 举例来说,网页上有一个菜单元素。鼠标悬停的时候,菜单...

Csoap2的博客 399

【DDR5 PCB走线SI/PI仿真调试】详细全攻略

问题场景发现症状优化措施过孔Stub效应TDR波形尖峰,信号反射严重使用盲孔,背钻减少Stub,降低Via数量串扰过大眼图闭合,误码率增加增加走线间距,插入地线隔离,减少平行长度电源阻抗过高PDN谐振导致纹波大多频率去耦,靠近电源引脚布置多档电容,合理分层信号时序失配优化走线长度匹配,避免信号走线跨层跳变DDR5设计不仅是硬件的挑战,更是仿真能力的考验。掌握SI/PI仿真,理解信号背后的物理本质,才能真正把握高速接口的“灵魂”!

weixin_43199439的博客 987

《网络信息制作与发布》实训全流程:从专题策划、网站构建到前端实现与上线发布

本文详细介绍了WEB设计专题网站从策划到发布的全流程。主要内容包括:1.网络专题设计(确定主题、编写策划方案、素材搜集整理);2.网站结构构建(设计二级栏目、绘制布局图);3.艺术设计(配色方案、版式设计);4.网页制作(使用Dreamweaver进行标准化布局);5.信息发布(通过Dreamweaver和CuteFTP上传文件、网站维护与备份)。以"学习WEB设计"专题为例,采用框架结构,包含20余个栏目,使用深灰和蓝色为主色调。文章提供了完整的操作步骤和技术要点,适用于网站开发学习者

深耕计算机专业知识与技术。 1532

说说你对JavaScript与有限状态机的理解

在前端开发中,JavaScript与有限状态机的关系紧密相连。有限状态机(Finite State Machine, FSM)作为一种数学模型,为前端开发提供了一个清晰且结构化的方式来管理和维护应用的状态。综上所述,JavaScript与有限状态机在前端开发中扮演着重要角色,它们共同确保了应用状态的清晰、可控和高效管理。

王铁柱666的博客 268

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

JS语言下的有限状态机设计及实现

概念 有限状态机(FSM)是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。在计算机科学中,有限状态机被广泛用于建模应用行为、硬件电路系统设计、软件工程,编译器、网络协议、和计算与语言的研究。 引用 在开发某个应用时,需要根据该应用内部的状态的改变来执行一些逻辑代码,比如应用的生命周期特性就可用该功能实现,我们试着用JS语言实现一个有限状态机模型 实现 步骤 假设现在已经有一个有限状态机,我们应该怎么使用它呢? 先创建一个有限状态机实例

在前端路上 1116

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

JavaScript有限状态机原理与应用详解

JavaScript有限状态机原理与应用详解 什么是有限状态机 有限状态机(Finite-state machine,简称FSM)是一种数学模型,用于描述系统在不同状态间的转换行为。它具有以下三个核心特征: 状态有限性:系统只能处于预先定义的有限个状态中 状态互斥性:在任何给定时刻,系统只能处于一个确定的状态 状态转换性:在特定条件下,系统可以从一个状态转换到另一个状态 在计算机科学领域,有限...

gitblog_00073的博客 509

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

JavaScript 中的有限状态机

http://www.ibm.com/developerworks/cn/web/wa-finitemach/ JavaScript 中的有限状态机Page navigation系列文章有限状态机很早就已用作设计和实现事件驱动的程序(比如网络适配器和编译器)内复杂行为的组织原则。现在,可编程的 Web 浏览器为新一代的应用程序开辟了一种全新的事件驱动环境。基于浏览器的应用程序因 Ajax 而广为流

深度Java 3771
上一篇: 不要自称为程序员
下一篇: 如何让搜索引擎抓取AJAX内容?
cmsbupt
博客等级 码龄19年 67粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值