如何在 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 跟踪分析事件

xstate - 如何正确处理转换错误?

[XState] Invoke Callbacks to Send and Receive Events from a Parent XState Machine

如何防止 XState 节点在接收事件时重置其子并行状态?

在 xstate 中生成子机器

存储在 XSTATE 中以便跨组件访问?