6

我对 xstate 中演员和调用服务之间的区别有点困惑,因为它们在我看来是一样的。

4

2 回答 2

8

最简单的解释是,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)
      })
    }
  }
});
于 2021-03-23T19:25:14.353 回答
3

调用的服务是派生的演员都是演员。创建它们的方式不同。我将互换使用术语“演员”和“服务”,但要区分“调用的演员/服务”和“生成的演员/服务”。

当机器进入具有invoke属性的状态时,它会创建服务。您必须事先决定要调用多少服务以及要调用哪些服务。当您退出调用服务的状态时,您将无法再与它们通信,并且在某些情况下(调用机器,返回清理函数的回调)服务将停止并清理。对此服务的引用保存在内部。这是发送请求或添加一些您可能想要退出的计算的好方法,或者等到演员完成它的事情。

通过spawn动作,您可以随时创建任意数量的演员。您创建的演员并没有一成不变,但您必须在上下文中存储对他们的引用。您还可以随时停止任何生成的演员。例如,您可以在一种状态下生成actor,并在有条件的动作时将其停止在另一种状态下。当您希望拥有可以随时按需生成或停止演员并且不希望被绑定到特定状态的系统时,它很有用。

除此之外-它们是相同的。

于 2021-03-20T09:32:35.087 回答