利用Promise来说有限状态机
这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战」。
导语
Promise是JS开发中常用的异步解决方案,除了利用观察者的设计模式之外,他也是利用了有限状态机这一数学模型的典型例子。本文将利用Promise的实现特点来讨论什么是有限状态机。
什么是有限状态机
有限状态机是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。有限状态机的关键点:有限和状态。
1.有限状态
有限状态可以直接按照字面理解,表示状态是有限的,这也是有限状态机的前提条件。举一个例子,小学有六个年级,假定每一个年级都是一种状态,那么我们可以认为小学一共有6个状态,状态的数量就是有限的。红绿灯一共有三种颜色状态,理论上应该是4种状态,即灯不亮的时候也算一种。
在 Promise 中,我们通常有三种状态:Pending,Resolve,Reject。那么我们也可以认为他是符合有限状态机的初步条件的,即有有限个数的状态。
2.初始状态
初始状态在状态机中也非常的重要,初始状态也是有效状态机的重要条件。在生活中,小学一年级是我们上小学的初始状态,红绿灯中的初始状态是熄灭。
在 Promise 中,当我们创建一个 Promise 对象时,Promise对象就会有一个初始状态,也就是当我们刚开始异步操作,还没有得到结果的时候,这时候的状态为 PENDING ,也就是 Promise 的初始状态。
3.状态转换
状态转换的意思是,通过某一种方式,允许当前状态集下的所有状态进行相互的转换,但这些状态未必是可以完全相转换的。依然拿上面生活中的例子去说明。当你从一年级升到二年级的时候,你的状态就发生了一次转换,但是相反的,通常情况下你似乎无法从二年级降级到一年级。红绿灯的例子也很明显,绿灯到红灯之间,我们必须经历黄灯的状态,似乎也无法从绿灯直接跳转到红灯。所以状态可以相互转换,但有一定限制。
在 Promise 中, 初始状态 Pending ,当异步操作返回结果之后,promise 的状态也会发生改变,执行成功就会走到 resolve 状态。执行失败就会走到 reject 状态, 在这里 resolve 和 reject 都是 promise 的最终状态,无法从 resolve 和 reject 再次回到 pending 状态,这也是我们提到的状态转换之间的限制。
给面试官的回答:
有限状态机是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型,他具备有限的状态,并且有一个初始状态。在达到特定的条件下这些状态可以发生相互的切换,但这些切换都是有制约和限制的,并不是随意地切换,最终在某一个状态下达到结束。在Promise中 Pendding,resolve和 reject 就是三种有限的状态,初始状态为 pendding,在异步操作收到结果时将状态切换到 rewolve或 reject,这两种状态也是promise中的最终状态。