xstate 中的参与者和调用服务有啥区别?
Posted
技术标签:
【中文标题】xstate 中的参与者和调用服务有啥区别?【英文标题】:What is the difference between an actor and invoking services in xstate?xstate 中的参与者和调用服务有什么区别? 【发布时间】:2021-06-10 13:15:05 【问题描述】:我对 xstate 中演员和调用服务之间的区别有点困惑,因为它们在我看来是一样的。
【问题讨论】:
【参考方案1】:调用的服务是派生的演员都是演员。创建它们的方式不同。我将互换使用术语“演员”和“服务”,但要区分“调用的演员/服务”和“生成的演员/服务”。
当机器进入具有invoke
属性的状态时,它会创建服务。您必须事先决定要调用多少服务以及要调用哪些服务。当您退出调用服务的状态时,您将无法再与它们通信,并且在某些情况下(调用机器,返回清理函数的回调)服务将停止并清理。对此服务的引用保存在内部。这是发送请求或添加一些您可能想要退出的计算的好方法,或者等到演员完成它的事情。
使用spawn
操作,您可以随时创建任意数量的演员。您创建的演员并没有一成不变,但您必须在上下文中存储对他们的引用。您还可以随时停止任何生成的演员。例如,您可以在一种状态下生成actor,并在有条件的动作时将其停止在另一种状态下。当您希望拥有一个可以随时根据需要生成或停止 Actor 并且不想被绑定到特定状态的系统时,它会很有用。
除此之外 - 它们是相同的。
【讨论】:
【参考方案2】:最简单的解释是services
被绑定到它们所处的状态。它们在机器进入/存在该状态时启动和停止。
Actor 不受特定状态的约束,它们可以在机器进入特定状态时启动和停止,但它们存在于上下文中,并且它们可以被机器中的每个状态访问.
示例:子机即服务(当机器进入pending
状态时启动,当机器存在该状态时自动停止。
const parentMachine = Machine(
id: 'parent',
initial: 'pending',
states:
pending:
invoke:
src: childMAchine
);
示例:子机器作为参与者,在机器进入waiting
状态时启动,作为localOne
属性存在于上下文中。
const parentMachine = Machine(
id: 'parent',
initial: 'waiting',
context:
localOne: null
,
states:
waiting:
entry: assign(
localOne: () => spawn(childMachine)
)
);
【讨论】:
以上是关于xstate 中的参与者和调用服务有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
redux 和状态机(例如 xstate)之间的实际区别是啥?