在 Scala 中,如何在两个连续的未来之间共享数据



我想在两个顺序执行的期货之间共享数据。这是我的代码草稿:

def deleteRecord(request: DeleteRequest): TwitterFuture[domain.Response] = {
    lazy val fn = {
      repository.findById(request.id).map { record: Option[TableRecord] =>
        val data = Map[String,Any](
            "id" -> String.valueOf(request.id),
            "study" -> String.valueOf(request.study),
            "associate" -> String.valueOf(record.get.associate),
            "role" -> String.valueOf(record.get.role)
          )
      }.flatMap { _ =>
        repo.delete(request.id).map { rowsAffected: Int =>
          /* audit study associate deletion */
          val event = audit(AuditEventType.RecordDeleted, principal.get, data)
          pipelineService.logEvent(topicSettings.database, event)
          domain.Response(status = Status.Created, data = Seq(rowsAffected))
        }
      }
    }
    secure(principal.get, fn)
  }

具体来说,我希望repo.delete块中的event能够从findById块访问data地图。

我基于 https://stackoverflow.com/a/25057306/3195691 实施顺序期货。

你需要使这个值成为你未来的结果,或者换句话说,你应该返回它。仅声明一个变量不会使块返回它 - 它只能在其声明范围内保持可访问性。

生成/返回结果并f2使用它f1示例:

import scala.concurrent._
import ExecutionContext.Implicits.global
import scala.concurrent.duration._
scala> val f1 = Future(1)
f1: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@538f7b25
scala> val f2 = f1.flatMap { v1 => Future(v1 + 2) }
f2: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@28d364fd
scala> val res = Await.result(f2, 2 seconds) // just to show the result, don't use Await!
res: Int = 3

在您的示例中,看起来像 findById 返回一个Future[Option[TableRecord]]。如果是这样,请将您的代码更改为以下内容:

repository.findById(request.id).map { record: Option[TableRecord] =>
        Map[String,Any](
            "id" -> String.valueOf(request.id),
            "study" -> String.valueOf(request.study),
            "associate" -> String.valueOf(record.get.associate),
            "role" -> String.valueOf(record.get.role)
        )
      }.flatMap { data => //... use `data` here

map返回的未来类型是Future[Map[String,Any]],传递给flatMapdata类型是Map[String,Any]

最新更新