Promise.f失败和引发异常之间的区别



这两种完成失败Future的方法有什么区别吗?如果是,哪种方式被认为更"正确"?

调用Promise.f失败:

def functionThatFinishesLater: Future[String] = {
    val myPromise = Promise[String]
    Future {
        // Do something that might fail
        if (failed) {
            myPromise.failure(new RuntimeException("message")) // complete with throwable
        } else {
            myPromise.success("yay!")
        }
    } (aDifferentExecutionContext)
    myPromise.future
}

或者只是抛出一个异常

def functionThatFinishesLater: Future[String] = {
    val myPromise = Promise[String]
    Future {
        // Do something that might fail
        if (failed) {
            throw new RuntimeException("message") // throw the exception
        } else {
            myPromise.success("yay!")
        }
    } (aDifferentExecutionContext)
    myPromise.future
}

在我看来,这就像是在混合范式。Promise是完成Future的必要方式,但Future也可以通过将计算封装在Future构造函数中来完成。你同时在做这两件事,这可能不是你想要的。两个代码片段中的第二条语句的类型都是Future[Promise[String]],我几乎可以肯定,您真的只想要Future[String]

如果您使用Future.apply构造函数,则应该将生成的值视为Future,而不是使用它来解析单独的Promise值:

val myFuture = Future {
    // Do some long operation that might fail
    if (failed) {
        throw new RuntimeException("message")
    } else {
        "yay!"
    }
}

使用Promise的方法是创建Promise,将其Future交给其他关心的代码,然后使用.success(...).failure(...)在一些长时间运行后完成它。综上所述,最大的区别是Future必须封装整个计算,但如果需要,您可以传递Promise并在其他地方完成它。

最新更新