【问题标题】:Scala Future oncomplete doesn't complete? [duplicate]Scala Future oncomplete 没有完成? [复制]
【发布时间】:2017-10-06 03:41:38
【问题描述】:

我正在尝试了解 scala 期货中的高阶函数。这段代码是我写的

import scala.concurrent.Future
import scala.util.{Failure, Success}
import scala.concurrent.ExecutionContext.Implicits.global


object App30 extends App {

  def getMilk(): String = {
    val ans = "5 gallons of milk"
    ans
  }
  def getFlour(): String =
  {
    val ans= "2 oz of flour"
    ans
  }

  val milkFuture = Future { getMilk() }
  val flourFuture = Future { getFlour() }

  val resultFut = {
    for {
      milk <- milkFuture
      flour <- flourFuture
      result = milk + flour
    } yield result
  }

  resultFut.onComplete{

    case Success(answer) => println("The result of getting ingridents is " + answer)
    case Failure(exception) =>  println("could not access future value")
  }
}

我的问题是我无法获得所需的字符串 'the result of getting ...' 。我看到调试器以 onComplete 停止并且没有继续成功案例。

我可以知道我哪里出错了吗?如果这是一个愚蠢的错误,请指出,然后我会记下这个问题。否则,请解释什么概念有问题,因为这将对新手有所帮助。

谢谢

【问题讨论】:

标签: scala


【解决方案1】:

你必须明确阻塞未来,否则主线程可能会在完成之前终止:

import scala.concurrent.{Await, Future}
import scala.concurrent.duration._

Await.result(resultFut, 5 seconds)

请注意,此类方法绝对不应与生产代码一起使用,它仅用于测试Future 的输出。通常,你会在后台无限运行一些事件循环,未来有机会完成,除非发生了不好的事情。

【讨论】:

  • 嗨,我可以知道如何使 onComplete 阻塞主线程,直到从未来获得值而不使用 await.result。谢谢
  • 你不能让 onComplete 阻塞,因为它是应用到 Future 的副作用,它不会返回值。也许我误解了这个问题?
猜你喜欢
  • 2017-04-20
  • 2017-08-01
  • 2021-05-30
  • 2023-04-05
  • 1970-01-01
  • 2014-05-22
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
相关资源
最近更新 更多