今天我研究了使用scala-async实现一些非常基本的东西,即一个可能失败的函数的重试循环。
首先,我无法在await()
块中使用try/catch
;很好,这是我猜的;所以我将函数转换为返回Future[Try[T]]
,这当然在正常情况下是多余的,因为Future[T]
已经包含任何异常但允许我在返回值上调用isSuccess
而不是{ {1}}。
然后我继续尝试实现循环逻辑。嵌套的递归try/catch
是不可能的(再次,如预期的那样),因为iter()
不能在嵌套函数中使用。与一个好的await()
一起开始使我成功,因为我实际上正在尝试while
函数,所以我并不关心返回值;但是,一旦我更改为Future[Try[Unit]]
并因此开始关注返回值,我就需要保存Future[Try[Int]]
来自Try[Int]
的呼叫,以便不仅能够如果await()
检查它,但也返回其内容。但是,只要我尝试isSuccess
,我就会收到错误消息:
val ret = await(...)
所以我的问题是,给出(至少)这三个限制,我说的最后一个限制是极其有限的,至少看似使得scala-async对于任何现实生活代码都没有用,除了仔细选择的例子如await must not be used under a by-name argument
,这个库目前已知的实用应用程序是什么?