首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未来的Akka FSM Goto

未来的Akka FSM Goto
EN

Stack Overflow用户
提问于 2015-04-07 10:39:00
回答 2查看 1.6K关注 0票数 5

我试图在未来改变密克罗尼西亚的状态,但我不工作..。我想我在找类似pipeTo的方法。

代码语言:javascript
复制
When(State.Waiting) {
   case Event(anyMsg, anyData) =>
      asyncCode.map(res =>
         if (res == 1) {
            goto(State.Working) using Data.MyData
         } else {
            stay() replying "bad response"
         }

      )
}

goto命令被执行,但是fsm不会将状态更改为State.Working

我一个人在周围找到了这份工作

代码语言:javascript
复制
When(State.Waiting) {
   case Event(anyMsg, anyData) =>
      asyncCode.map(res =>
         if (res == 1) {
            self ! "do job"
         } else {
            stay() replying "bad response"
         }

      )
   case Event("do job", anyData) => {
      goto(State.Working) using Data.MyData
   }
}

也许有一个更好的解决问题的办法

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-07 11:10:08

不要改变你的演员在未来的状态,或任何不在主“线程”内的东西。解决问题的正确方法是向自我发送一条信息,这只会改变你的状态,比如

代码语言:javascript
复制
When(State.Waiting) {
  case Event(anyMsg, anyData) =>
    asyncCode.map(res =>
      if (res == 1) {
        self ! GoToWorking(Data.MyData)
      } else {
        self ! Stay
      }
    )
    goto(State.WaitingForResponse)
}

When (State.WaitingForResponse) {
  case Event(GoToWorking(data), _) =>
    goto(State.Working) using data
  case Event(Stay,_) =>
    stay()
}
票数 10
EN

Stack Overflow用户

发布于 2015-04-07 11:04:37

您永远不应该从异步回调(例如,未来组合器)中关闭和修改参与者的状态。对于FSM方法也是如此,它们对参与者是私有的。参与者应对异步事件的唯一方式是接收消息。您的第二段代码几乎是正确的,只是您甚至不应该从回调中调用that ()。异步结果应该作为发送给参与者的消息结束,而消息反过来又可以更改其状态。您可能需要引入一个新的等待状态,在启动异步调用时转换到这个状态,一旦完成(参与者接收到结果),转到State.Working。

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

https://stackoverflow.com/questions/29489564

复制
相关文章

相似问题

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