我有一个场景,其中有一台父计算机和几台可以从该父计算机生成的子计算机。
当前设置如下:
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
}
我缺少明显的东西吗?这可能吗?
答案 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"))