【发布时间】:2021-06-17 13:57:49
【问题描述】:
假设我有几个函数返回Future:
def fab(a: A, timeOutMillis: Long): Future[B] = ???
def fbc(b: B, timeOutMillis: Long): Future[C] = ???
def fcd(c: C, timeOutMillis: Long): Future[D] = ???
如果timeOutMillis > 0 函数返回在timeOutMillis 时间段内完成的期货。否则他们返回一个失败的Future。
现在我想编写这些函数来编写fac 和fad:
def fac(a: A, timeOutMillis: Long): Future[C] = ???
def fad(a: A, timeOutMillis: Long): Future[D] = ???
所以我可以像这样实现fac:
def fac(a: A, timeOutMillis: Long): Future[C] = {
val startTime = System.currentTimeMillis()
for {
b <- fab(a, timeOutMillis)
timeAB = System.currentTimeMillis() - startTime
c <- fbc(b, timeOutMillis - timeAB)
} yield c
}
注意我不想等待完成期货,因此我不使用Await。
这个fac 实现可能会起作用,但它看起来很笨拙并且包含样板代码。
你会如何建议链 Futures 超时?
附:我正在考虑覆盖flatMap 的Future 来计算下一次超时。你怎么看?
【问题讨论】:
标签: scala concurrency timeout future