在Scala.js中超时,将来超时

问题描述 投票:0回答:1

我需要在跨平台的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?

scala future scala.js
1个回答
0
投票

您的代码并未真正为现有的未来增加超时时间。那不可能您正在做的是在该特定点为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都支持。

© www.soinside.com 2019 - 2024. All rights reserved.