scxml 事件中的循环调用

用户98651

我有一个带有“invoke”元素的 scxml 事件。当事件被调用时,这个 invoke 元素更新数据模型元素。我怎样才能使这种情况定期发生?例如,是否可以每秒定期调用此调用?或者也许每秒过渡到事件?

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

jbeard4

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

现在,回答你的问题:

当事件被调用时,这个 invoke 元素更新数据模型元素。

我认为您将其概念化的方式可能存在问题,因为被调用的会话具有自己的数据模型(也就是说,它自己的内存)。您可以使用 绑定子会话的初始数据模型值<param>,但您不能真正在父会话和子会话之间共享内存。这意味着您不能使用 eg<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> 元素的状态以下(未经测试的)代码可能会起作用:

<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 部分。

我不相信transition是 的合法孩子finalizefinalize旨在包含可执行内容(例如scriptassign),允许您在子会话发送的事件被父会话处理之前对其进行操作。

https://www.w3.org/TR/scxml/#finalize

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SCXML是否支持<transition>块中的条件目标?

来自分类Dev

如何从xml / scxml获取属性

来自分类Dev

Apache SCXML:添加自定义操作

来自分类Dev

为Qt SCXML创建自定义数据模型

来自分类Dev

Tcl中的事件循环

来自分类Dev

在插槽中调用QDialog :: exec是否会阻塞主事件循环?

来自分类Dev

React:componentDidUpdate 或 render 中事件触发的 Ajax 调用会创建无限循环

来自分类Dev

什么是React中的事件循环?

来自分类Dev

在jQuery中循环动作/事件

来自分类Dev

Qt中的libuv事件循环

来自分类Dev

JavaScript中的事件循环模型

来自分类Dev

什么是React中的事件循环?

来自分类Dev

在点击事件中添加for循环

来自分类Dev

从构建事件中调用方法

来自分类Dev

构造函数中的事件调用

来自分类Dev

如何通过在onclick事件中使用函数并使用循环从函数中的数组中计数函数来调用多个JavaScript函数?

来自分类Dev

循环调用列表中的递归调用

来自分类Dev

Extjs中的循环服务调用

来自分类Dev

循环python中的函数调用

来自分类Dev

在for循环中仅调用一次事件

来自分类Dev

Qt从其他线程向事件循环添加函数调用

来自分类Dev

调用协程而不产生事件循环

来自分类Dev

Qt从其他线程向事件循环添加函数调用

来自分类Dev

Node.js中的事件循环是运行回调本身还是只是将回调传递给调用堆栈,以便调用堆栈执行回调?

来自分类Dev

RuntimeError:事件循环在异步python中关闭

来自分类Dev

For循环未在订阅事件中执行

来自分类Dev

我在pygame中的事件循环有问题

来自分类Dev

RuntimeError:事件循环在异步python中关闭

来自分类Dev

播放事件将在videojs中无限循环

Related 相关文章

热门标签

归档