如何在 XState 机器中执行操作 send('EVENT_NAME', to:'something from context')?
Posted
技术标签:
【中文标题】如何在 XState 机器中执行操作 send(\'EVENT_NAME\', to:\'something from context\')?【英文标题】:how in XState machine to do action send('EVENT_NAME', to:'something from context')?如何在 XState 机器中执行操作 send('EVENT_NAME', to:'something from context')? 【发布时间】:2020-07-13 16:41:46 【问题描述】:我需要将事件发送到另一个生成的状态机,它的 ID 作为字符串在上下文中的变量中。 (它不是父状态机,也不是子状态机)
喜欢
context.sendTo = 'B_id'
如何使用上下文中的参数执行send()
?
以及如何将send('MY_EVENT_NAME', to: <something from context> )
放入MachineOptions
actions
部分?
// this does not work...
const myMachineOptions:Partial<MachineOptions<any,any>> =
actions:
mySend: (context, event)=>send('MY_EVENT_NAME', to: context.sendTo )
附言
就像在 Pass values when sending events from one machine to another in xState
但我需要动态的不是消息正文,而是to:
部分
【问题讨论】:
【参考方案1】:在 XState https://github.com/davidkpiano/xstate/issues/1110 开发人员的帮助下
actions
actionSendMyEvent:
send('MY_EVENT_NAME', to: context => context.sendTo )
非常感谢 XState 开发人员和维护人员!!!
【讨论】:
很高兴了解为什么您的原始解决方案不起作用。 @monzie 我相信原始解决方案不起作用,因为send
是“动作创建者”并且不会强制发送事件。请参阅有关发送操作的文档:xstate.js.org/docs/guides/actions.html#send-action(特别是该部分中的警告)。您会注意到文档中的工作示例采用 OP 的答案的形式,而不是在他的问题中,动作是返回 send
动作创建者结果的函数。
感谢@Boris 和@Jon 的提问和解答。我在 Vue 应用程序中为这个设置而苦苦挣扎。我有一个alert-machine
,它在我启动我的应用程序时被实例化。这是一台简单的机器,我也可以发送用户通知。当我在其他文件/组件中创建机器时,我不确定将事件发送到警报机器的最佳方式,因为它已经是一个正在运行的服务。我是否将服务导入其他机器?我试过send('ALERT', to: 'alert', alert: 'TEST' )
,得到Unable to send event to child 'alert' from service
。一台机器如何将事件发送到另一个正在运行的服务?
我也遇到了同样的问题,请问您解决了吗?以上是关于如何在 XState 机器中执行操作 send('EVENT_NAME', to:'something from context')?的主要内容,如果未能解决你的问题,请参考以下文章
[XState] Invoke Callbacks to Send and Receive Events from a Parent XState Machine