将事件发送到 XState 中的子服务数组

Posted

技术标签:

【中文标题】将事件发送到 XState 中的子服务数组【英文标题】:Send event to array of child services in XState 【发布时间】:2020-04-06 10:24:39 【问题描述】:

我有一个场景,我有一台父计算机和几台可以从父计算机生成的子计算机。

当前设置如下所示:

const parentMachine = Machine(
  context: 
    children: [] //can contain any number of child services
  ,
  ...
  on: 
    ADD_CHILD: 
       actions: assign(
         children: (ctx, e) => 
           return [
             ...ctx.children,
             
               ref: spawn(childMachine)
             ,
           ];
         ,
      ),
    ,
    UPDATE_CHILDREN: 
      actions: ??? //need to somehow loop through children and send the UPDATE event to each service
    
  
);

当父机器收到“UPDATE_CHILDREN”事件时,我想更新每个子服务。我知道您可以通过将数组传递给send 来发送批处理事件,但我希望每个事件也可以发送到不同的服务。我只看到一次将它们发送到单个服务的示例。我已经尝试了几件事,包括以下内容:

UPDATE_CHILDREN: 
  actions: ctx => ctx.children.forEach(c => send("UPDATE",  to: () => c.ref ) //doesn't send 

我是否遗漏了一些明显的东西?这可能吗?

【问题讨论】:

你试过吗:actions: ctx => ctx.children.forEach(c => c.send("UPDATE")) 【参考方案1】:

了解这应该如何在 XState 中工作。

对孩子的引用已经被存储了,所以我们基本上可以直接向他们发送事件而不使用“to”属性:

actions: ctx => ctx.children.forEach(c => c.ref.send("UPDATE"))

【讨论】:

【参考方案2】:

啊,我遇到了和你一模一样的问题!

事实证明,如果你给actions 一个函数,它会假定该函数是实际操作,而不是返回操作的函数。

如果你想根据上下文生成你的动作,你需要使用a pure action:

import  actions  from 'xstate';

const  pure  = actions;

...

    actions: pure((context, event) =>
      context.myActors.map((myActor) =>
        send('SOME_EVENT',  to: myActor )
      )
    ),

这是一个棘手的错误,因为您没有收到任何反馈表明您做错了什么。

【讨论】:

以上是关于将事件发送到 XState 中的子服务数组的主要内容,如果未能解决你的问题,请参考以下文章

在 xstate 中生成子机器

如何正确使用 Angular 中的 Observable 将数组数据从父级发送到子级?

如果你发送一个在 React Xstate 中不存在的事件会发生啥?

将数组中的 Json 对象发送到服务器

如何使用钩子将项目附加到 React 组件中的数组?

将对象发送到Django中{%include%}标记中的子模板