Promise.failure和抛出异常之间的区别?

时间:2014-08-29 01:44:58

标签: scala promise future

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

致电Promise.failure:

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
}

1 个答案:

答案 0 :(得分:4)

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

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

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

使用Promise的方法是创建Promise,将其Future提供给其他一些关心的代码,然后使用.success(...)或{{ 1}}在经过一些长时间的运行后完成它。所以回顾一下,最大的区别是.failure(...)必须包装整个计算,但如果需要的话,你可以传递Future并在其他地方完成。