我需要在跨平台的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?
您的代码并未真正为现有的未来增加超时时间。那不可能您正在做的是在该特定点为waiting for将来设置超时。这样,您就可以通过创建一个未来的方式以完全完全异步的方式进行复制,]
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都支持。