Scala.js 中的未来超时
Timeout a Future in 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 上都受支持。
我需要在跨平台的 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 上都受支持。