加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 返回演员的未来消息

发布时间:2020-12-16 18:04:58 所属栏目:安全 来源:网络整理
导读:我有一个返回Future的现有API.现在为其中一个用例引入Actor并尝试继续使用相同的服务API.从下面你可以看到MyService.saveValues返回未来. object MyActor { implicit val ec = scala.concurrent.ExecutionContext.Implicits.global implicit val timeout = T
我有一个返回Future的现有API.现在为其中一个用例引入Actor并尝试继续使用相同的服务API.从下面你可以看到MyService.saveValues返回未来.

object MyActor {
   implicit val ec = scala.concurrent.ExecutionContext.Implicits.global
   implicit val timeout = Timeout(1 second)
   case class SampleMessage(list: List[String])
   val actorSystem =  //get actorSystem that was created at the startup


  def saveMessage(list: List[String])  ={
    val res = (actorSystem.actorOf(Props[MyActor]) ? SaveMyMessage(list) ).mapTo[Future[/[Throwable,String]]
 //res map{ r=>

 //}

 }
}
class MyActor extends Actor {
import MyActor._

def receive = {
  case SaveMyMessage(list) =>

   val originalSender = sender

   val res : Future[/[Throwable,String] ] = MyService.saveValues(list)


   originalSender ! res
  }
}

正如你在def saveMessage中看到的那样,我正在使用ask等待演员的结果.然而,ask也会创建自己的未来,因此saveMessage中的结果(val res)变为Future [Future [T]],看起来很烦人.处理这种情况的最佳方法是什么?

解决方法

pipeTo将Future的结果转发给ActorRef.

import akka.pattern.pipe


val originalSender = sender
val res : Future[/[Throwable,String] ] = MyService.saveValues(list)
res pipeTo originalSender

如果saveValues抛出,你的未来永远不会完成,但最终会计时出局.

如果你最终得到了Future [Future [A]],但是因为排序/遍历或其他东西想要Future [A],你总是可以“flatMap that that shit”.

import ExecutionContext.Implicits.global
val foo: Future[Future[Int]] = ???
val bar: Future[Int] = foo.flatMap(identity)

如果您已经依赖于scalaz(以及scalaz.contrib,如果在scalaz 7.0.x上),则可以使用monad语法中定义的连接.

import scalaz.syntax.monad._
import scalaz.contrib.std.scalaFuture._
val bar2: Future[Int] = foo.join

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读