【问题标题】:Wait for Future[List[Object]] to complete asynchronously in Scala等待 Future[List[Object]] 在 Scala 中异步完成
【发布时间】:2017-09-30 18:55:57
【问题描述】:

我有一个Future[List[Object]] 喜欢

val futuresList: Future[List[Object]] = foo()

我还有另一种方法,它采用 futuresList 并进行一些计算。

我希望这个 future 在我可以将它传递给另一个返回 Future 的方法之前完成执行。

val futuresList: Future[List[Object]] = foo()
val anotherFuture: Future[Seq[Object]] = bar(futuresList, x, y)

现在我想异步等待futureList完成,之后我想将它传递给bar()

到目前为止,我已经尝试过了

futuresList.onComplete {
  case Success(data) => {  
    //call bar here, but how do I get access 'anotherFuture' ?
  }
}

希望获得有关如何通过确保 futuresList 完整来访问来自 bar() 的响应的一些指导。谢谢

【问题讨论】:

    标签: scala asynchronous future


    【解决方案1】:
    val anotherFuture = futuresList.flatMap(data => bar(Future.successful(data), x, y))
    

    或者如果您更喜欢 for-comprehension 语法,它是等效的:

    val anotherFuture = for {
      data <- futuresList
    } yield {
      bar(Future.successful(data), x, y)
    } 
    

    【讨论】:

    • 但是data 的类型不是List[Object]bar() 要求它是Future[List[Object]] 吗?
    • 我的疏忽。然后将其包裹在Future.successful() 中。我的答案更新了。
    • 顺便说一下,通常如果一个方法期望一个值在调用之前可用,它直接采用值类型(即在您的情况下为Object)而不是Future。期望调用者传入完成的未来很容易出错。只是随口一说,你的情况可能会有所不同。
    • 绝对......我看到了一些不寻常的执行顺序,我试图调试它。感谢您的投入。
    • 技术上,在这种情况下,你可以使用futuresListiso Future.successful(data)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 2013-03-28
    • 2020-10-04
    • 2019-03-02
    • 2019-05-31
    • 1970-01-01
    • 2020-01-14
    相关资源
    最近更新 更多