繁体   English   中英

Scala摆脱了嵌套的期货

[英]Scala getting rid of nested futures

您能帮我用一种更好的方式写它吗:

Future {
    Thread sleep 200
    5
} onComplete{
    case Success(e) => Future {
        doSomething(e)
        Thread sleep 200
        6
    } onComplete {
        case Success(e) =>
            Future {
                doSomething(e)
                Thread sleep 200
            } onComplete {
                case Success(_) => println("finished")
                case Failure(e) => e.printStackTrace()
            }
        case Failure(e) => e.printStackTrace()
    }

    case Failure(e) => e.printStackTrace()
}

现在代码看起来很糟糕,如果我以这种方式添加更多的期货,情况将会变得更糟。。。这显然是显示问题的一个示例,因此,我希望提及更广泛的上下文。

@update如果不清楚,我将尝试澄清。 我有三个期货,想要执行第一个,完成时执行第二个,完成时执行-第三个。 第二个Future使用第一个的结果,而第三个使用第二个的结果。 如果期货之一失败,则将打印堆栈跟踪并中断调用序列。 这就是我想要在上面的代码中显示的内容,并且如果可能的话,我希望以更好的,非嵌套的方式来实现它。

@update 2如果我单独处理每个未来的失败也很棒

与集合非常相似,您可以将map()flatMap()期货( scaladoc )组合在一起:

Future {
  Thread sleep 200
  5
}.map { result =>
  doSomething(result)
  Thread sleep 200
  6
}.map { result =>
  doSomething(result)
  Thread sleep 200
}.onComplete {
  case Success(_) => 
    // All steps completed successfully
    println("finished")
  case Failure(e) => 
    // This can be a failure from any of the steps
    e.printStackTrace()
}

地图生成结果,而flatMap生成Future实例。

或者,您可以使用理解,这只是(平面)地图调用的语法糖。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM