首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在scxml事件中循环调用

在scxml事件中循环调用
EN

Stack Overflow用户
提问于 2018-10-08 09:17:00
回答 1查看 326关注 0票数 0

我有一个带有"invoke“元素的scxml事件。此invoke元素在调用事件时更新datamodel元素。我怎样才能定期做到这一点呢?是否有可能周期性地调用此调用--例如,每秒钟调用一次?或者每隔一秒就转移到这个事件上?

后者的问题是,如果我在调用的finalize部分中放置一个转换,调用它自己,它似乎不会多次调用invoke部分。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-08 13:30:55

我首先想提供一些关于<invoke>的背景知识。<invoke>被放置为<state>的子级。它在进入状态时启动子状态机会话,并在退出状态时停止会话。此外,如果子会话进入<final>状态,则在父会话上分派一个done.invoke.invokeid事件。您可以在父状态的转换中使用此done.invoke.invokeid事件,以便在子会话终止时强制父状态退出。最后,父状态和子状态可以通过<send>相互通信。父级可以使用<send>与子节点进行通信,target属性设置为_invoke_invokeid,子节点可以通过<send>与父级进行通信,target属性设置为_parent

现在,回答你们的问题:

此invoke元素在调用事件时更新datamodel元素。

我认为您对此进行概念化的方式可能有问题,因为被调用的会话有自己的数据模型(也就是说,它自己的内存)。可以使用<param>绑定子会话的初始数据模型值,但不能在父会话和子会话之间真正共享内存。这意味着您不能使用例如<assign><script>标记直接在子会话中更新父会话中的数据模型。

子会话更新父会话中的数据模型的唯一方法是通过传递事件(例如<send event="update" target="_parent"><param name="dataToUpdate" expr="dataToUpdate"/></send>)与父会话进行通信。然后,父级需要有一个<transition>元素,以便它能够处理从子会话发送的事件,例如<transition event="update"><assign location="dataToUpdate" expr="_event.dataToUpdate"/></transition>

这就引出了一个问题,即<invoke>是否是定期更新数据模型的最佳、最简单的方法。例如,将数据模型更新逻辑放在<parallel>状态的子级中可能更简单。这样,您可以使用<assign>直接更新数据模型。

我怎样才能定期做到这一点呢?是否有可能周期性地调用此调用--例如,每秒钟调用一次?或者每隔一秒就转移到这个事件上?

要定期调用会话,您需要输入和退出包含<invoke>元素的状态。以下(未经测试的)代码可能会工作:

代码语言:javascript
复制
<state id=invokeParent">
  <!-- this is some data that you want the child session to update in the parent session -->
  <datamodel>
    <data id="dataToUpdate" />
  </datamodel>
  <onentry>
    <send event="loop" delay="1s"/> <!-- send the 'loop' event every second to loop in invokeParent -->
  </onentry>
  <transition event="loop" target="invokeParent" /> <!-- this transition will exit and re-enter the state, restarting the invoked session -->
  <transition event="done.invoke.myInvoke" target="invokeParent" /> <!-- also loop if the invoked session terminates -->
  <invoke id="myInvoke" type="scxml" src="file:test276sub1.scxml"/> <!-- this is the invoke -->
  <!-- this targetless transition handles the update event sent from the child session to the parent to update the parent's datamodel -->
  <transition event="update">
    <assign location="dataToUpdate" expr="_event.dataToUpdate"/>
  </transition>
</state>

后者的问题是,如果我在调用的finalize部分中放置一个转换,调用它自己,它似乎不会多次调用invoke部分。

我不相信transitionfinalize的合法子女。finalize是指包含可执行内容(例如,scriptassign),这些内容允许您在父会话处理子会话发送的事件之前操纵它们。

请参阅https://www.w3.org/TR/scxml/#finalize

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52699005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档