gpt4 book ai didi

scala - 如何等待 Scala future 的 onSuccess 回调完成?

转载 作者:行者123 更新时间:2023-12-02 15:56:18 25 4
gpt4 key购买 nike

在 Scala 中,我可以使用 Await 来等待 future 完成。但是,如果我注册了一个回调以在该 future 完成时运行,我如何不仅等待 future 完成,而且还等待该回调完成?

这是一个最小但完整的程序来说明问题:

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import scala.concurrent.{ Await, Future }

object Main {
def main(args: Array[String]): Unit = {
val f: Future[Int] = Future(0)
f.onSuccess { case _ =>
Thread.sleep(10000)
println("The program waited patiently for this callback to finish.")
}

// This waits for `f` to complete but doesn't wait for the callback
// to finish running.
Await.ready(f, Duration.Inf)
}
}

我希望输出是:

The program waited patiently for this callback to finish.

相反,没有任何输出;程序在回调完成之前退出。

请注意,这与等待 future 完成不是同一个问题,之前已在 this question 中回答过该问题。 .

最佳答案

不要使用 onSuccess 回调,而是在 Future.map 调用中执行副作用。这样,您就可以在 Future[Unit] 上使用 Await。

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import scala.concurrent.{ Await, Future }

object Main {
def main(args: Array[String]): Unit = {
val f: Future[Int] = Future(0)
val f2: Future[Unit] = f.map { x =>
Thread.sleep(10000)
println("The program waited patiently for this callback to finish.")
}

Await.ready(f2, Duration.Inf)
}
}

请注意,如果您只想在成功的情况下执行副作用(如您的示例中所示),则映射是合适的。如果您想在失败的情况下执行副作用,那么 andThen 是正确的方法。看这个post来自 Roland Kuhn 关于 scala-user 的内容。

此外,请不要在生产代码附近的任何地方使用 Thread.sleep。

关于scala - 如何等待 Scala future 的 onSuccess 回调完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34808024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com