scala - 在 Scala.js 中超时未来
问题描述
我需要在跨平台 JVM/JS 应用程序中的 Future 上设置超时。此超时仅用于测试,因此阻塞解决方案不会那么糟糕。
我实现了以下代码片段以使 JVM 上的未来超时:
def runWithTimeout[T](timeoutMillis: Int)(f: => Future[T]) : Future[T] =
Await.ready(f, Duration.create(timeoutMillis, java.util.concurrent.TimeUnit.MILLISECONDS))
这在 Scala.js 上不起作用,因为它没有实现Await
. 是否有任何其他解决方案可以在 Scala.js 和 Scala JVM 中为 Future 添加超时?
解决方案
您的代码并没有真正为现有的未来添加超时。那是不可能的。您正在做的是设置超时以在该特定时间等待该未来。那,你可以通过创建一个未来的完全异步的方式来重现
- 解决
f
它是否在给定的超时时间内完成 - 否则解析为失败
TimeoutException
import scala.concurrent._
import scala.concurrent.duration.Duration
import scala.scalajs.js
def timeoutFuture[T](f: Future[T], timeout: Duration)(
implicit ec: ExecutionContext): Future[T] = {
val p = Promise[T]()
val timeoutHandle = js.timers.setTimeout(timeout) {
p.tryFailure(new TimeoutException)
}
f.onComplete { result =>
p.tryComplete(result)
clearTimeout(timeoutHandle)
}
p.future
}
以上是为 Scala.js 编写的。您可以为 JVM 编写一个等效的代码,并将它们放在与平台相关的源代码中。
或者,您可能可以编写类似的东西java.util.Timer
,它在 JVM 和 JS 上都受支持。
推荐阅读
- javascript - 对列表中的每个对象进行 api 调用
- angular - 如何关闭 mouseover 和 mouseout 事件中的错误
- language-agnostic - 将游戏逻辑与渲染线程分离
- javascript - 你好。我想降低 java 脚本中按钮到顶部的滚动速度。任何人都可以帮助我吗?
- datetime - Hive 中的高效日期案例逻辑
- python - 使用 cuda 在 pytorch 1.0 上训练 frcnn:分段错误(核心转储)
- vba - 总连续天数。我怎么知道 Date+1 是否存在?
- python - 为什么范围不返回一个数组,但是当我将它添加到列表时呢?
- java - 如何使PMD的自定义java规则集按类别返回结果
- sql - VBA中的SQL语句太长