调用的服务和生成的参与者都是参与者。差异在于您创建它们的方式。我将互换使用术语“参与者”和“服务”,但区分“调用的参与者/服务”和“生成的参与者/服务”。
当机器进入有属性的状态时invoke,它创建服务。您必须事先决定要调用多少个服务以及您到底要调用哪些服务。当您退出被调用服务的状态时,您将无法再与它们通信,并且在某些情况下(调用机器、返回清理函数的回调)服务将被停止并清理。对此服务的引用保留在内部。这是发送请求或添加一些您可能想要选择退出的计算的好方法,或者等待参与者完成它的工作。
通过spawn行动,您可以随时创建任意数量的演员。您要创建的角色并不是一成不变的,但您必须在上下文中存储对它们的引用。您还可以随时停止任何生成的演员。例如,您可以在一种状态下生成 actor,并在其他状态下或有条件地根据操作停止它。当您希望拥有一个可以随时根据需要生成或停止参与者并且不希望受限于特定状态的系统时,它非常有用。
除此之外-它们是相同的。
最简单的解释是services绑定到它们所处的状态。当机器进入/存在该状态时,它们会启动和停止。
Actors 不受特定状态的约束,它们可以在机器进入特定状态时启动和停止,但它们存在于上下文中,并且可以访问机器中的每个状态。
示例:子机器即服务(机器进入pending状态时启动,机器处于此状态时自动停止。
const parentMachine = Machine({
id: 'parent',
initial: 'pending',
states: {
pending: {
invoke: {
src: childMAchine
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
示例:子机器作为参与者,在机器进入waiting状态时启动,作为localOne属性存在于上下文中。
const parentMachine = Machine({
id: 'parent',
initial: 'waiting',
context: {
localOne: null
},
states: {
waiting: {
entry: assign({
localOne: () => spawn(childMachine)
})
}
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
364 次 |
| 最近记录: |