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

时间:2019-12-13 00:24:16

标签: javascript xstate

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

当前设置如下:

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 
}

我缺少明显的东西吗?这可能吗?

2 个答案:

答案 0 :(得分: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 })
      )
    ),

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

答案 1 :(得分:0)

已经意识到应该在XState中如何工作。

已经存储了对子代的引用,因此我们基本上可以直接将事件发送给子代,而无需使用“ to”属性:

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