Open su37josephxia opened 2 years ago
首先 Promise的本质是有限状态机(finite-state machine)。它持有一系列的状态。对于每个状态,状态机都将接收各种事件然后执行转换并在转换后执行相对应的动作。在Promise中,状态即为PEDING,FULFILLED,REJECTED;事件为各种回调函数;转换为fulfill,reject方法;动作则是fulfill,reject在执行完状态转换之后做的事。
整个Promise简单来说就是一个状态机,在不同状态时做出不同的相应。
Promise基本上具有一个有限状态机的所有主要因素。一个Promise的状态机在其生命周期中通过状态的转移,来控制异步函数的同步执行,在一定程度上保证了回调函数的callback hell。
什么叫有限状态机 有限状态机(finite-state machine: FSM)又称为有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模式。 Promise 是一个具有三个状态的有限状态机,它们分别是 Pending、Fulfilled 和 Rejected。Pending 表示挂起状态,Fulfilled 表示完成状态,Rejected 表示出错状态。Pending状态可以转变为 Fulfilled,也可以转变为 Rejected。而当处于 Fulfilled 或 Rejected 状态时,是无法再转变成其它状态。
有限状态机:
Promise其实本质上就是一个状态机
PENDING(执行中),FULFILLED(已完成),REJECTED(已拒绝)分别是Promise的状态机模式下的三个状态
Promise就是对上述三个状态的变化操作,最后状态转移到成功FULFILLED或失败REJECTED
定义:表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型
状态机的 5 个特征:
Promise 有三种状态:
满足状态机有限个状态的特征
通过 resolve 和 reject 方法改变状态,满足有限事件和变换器的特征
一个初始状态 pending
两种最终状态:fulfilled 和 rejected
有限状态机,一个正确的有限状态机只有有限个状态,可是容许这个状态机不间断地运行下去。\ Promise其实本质上就是一个状态机\ Promise 核心状态为Pending,Fulfilled以及Rejected,使用resolve和 reject 方法可以改变状态,可以使用多个then方法实现串联
pending
、fulfilled
、rejected
三种resolve
时,状态从 pending => fulfilled
,当执行 reject
时,状态从 pending => rejected
fulfilled
时,执行 then 函数的 onFulfilled
方法;当状态处于或者变为 rejected
时,执行 then 函数的 onRejected
方法谈谈Promise与有限状态机的关系
有限状态机:
Promise的本质是有限状态机:
有限状态机主要有有限和状态两个特点,随着状态的切换,所处的流程和执行方法都可能不同,而且状态是有限个,即可以枚举出来。最简单的有限状态机应该是 if,switch。
Promise 主要用 3 种状态进行控制,‘pending’,‘fulfilled’, ‘rejected’,根据 3 个状态采取不同的行为,状态一旦变化就不会再变。而 Promise 实现链式调用主要靠返回了新的 promise。
function Promise(fn) {
this.status = 'pending'
this.value = undefined
this.onFulfilled= null
this.onRejected= null
const resolve = value => {
if (this.status === 'pending') {
this.status = 'fulfilled'
this.value = value
this.onFulfilled && this.onFulfilled(value)
}
}
const reject = value => {
if (this.status === 'pending') {
this.status = 'rejected'
this.value = value
this.onRejected && this.onRejected(value)
}
}
}
Promise.prototype = {
then(onFulfilled, onRejected) {
if (this.status === 'pending') {
this.onFulfilled = onFulfilled
this.onRejected = onRejected
}
if (this.status === 'fulfilled') {
onFulfilled(this.value)
} else if (this.status === 'rejected') {
onRejected(this.value)
}
}
}
有限状态机是一种编程思路。是一种对事物状态变化的抽象, 某一时刻只能有一种状态, 只能通过某个方法动作才可以改变状态。
而promise
就是一个典型的有限状态机。状态有 PENDING
,FULFILLED
,REJECTED
,resolve/reject
就是它的状态变更方法。而且如果当前是 FULFILLED/REJECTED
,就不能从 FULFILLED/REJECTED
变成 PENDING
状态
有限状态机试一个数学模型,用于抽象的表示事务的运行规则。 主要包括四个元素,状态,事件,动作,变换
通过事件的条件判断,去执行动作,并且变换事务的状态。 最典型的就是红绿灯和自动门状态机模型。
那么Promise其实也用到了有限状态机模型。
一个Promise对象有三种状态,pending、fulfilled、rejected,一旦Promise对象实例化完成,状态初始就是pending 异步的逻辑处理,会有条件判断,当成功则会调用resolve去变换状态为fulfilled,失败则会调用reject去变换状态为rejected。 在这个过程中, 既有状态,即上述的三种状态, 也有事件,即Promise内部包裹的异步代码,最终成功和失败的判断 也有动作,即状态变换为fulfilled或者rejected之后,回调里执行的逻辑 也有变换,即有resolve或者reject方法触发的状态的转变
这其实就是一个典型的有限状态机模型了。
Promise的本质是有限状态机(finite-state machine)。它持有一系列的状态。对于每个状态,状态机都将接收各种事件然后执行转换并在转换后执行相对应的动作。在Promise中,状态即为PEDING,FULFILLED,REJECTED;事件为各种回调函数;转换为fulfill,reject方法;动作则是fulfill,reject在执行完状态转换之后做的事。
PENDING:fulfill还未被执行,表示这个Promise的工作还未开始或者未结束。在此时调用then,会把then的onFulfilled和onRejected保存在内部的队列中。
FULFILLED:fulfill被执行,此时状态已不会再改变,表示这个Promise的工作已经完成,所以在fulfill被执行时,先改变内部储存的结果值result,再执行内部队列中的每一个onFulfilled。在执行这个onFulfilled的过程中,可能会执行另一个Promise(then返回的Promise)的fulfill,从而递归式地、dfs地执行。
REJECTED:与FULFILLED相同,唯一区别就是出现错误,reject被调用,value变成reject的错误,并调用内部队列的onFulfilled。
即然从始至终都是fulfilled来实现状态转变,那么为什么需要resolve方法呢?
这是因为then的回调函数中的返回值有可能是一个Promise。按照规范,如果返回一个Promise,那么需要等这个Promise的完成工作,并且用它fulfilled的值来作为结果。