【问题标题】:Timeout a Future in Scala.js在 Scala.js 中超时未来
【发布时间】:2020-08-04 07:00:59
【问题描述】:

我需要在跨平台 JVM / JS 应用程序中设置 Future 超时。这个超时只会在测试中使用,所以阻塞解决方案不会那么糟糕。

我实现了以下 sn-p 以使 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】:

    您的代码并没有真正为现有的未来添加超时。那是不可能的。你正在做的是在那个特定的时刻为等待那个未来设置一个超时。也就是说,您可以通过创建一个未来来以不同的、完全异步的方式进行复制

    • 如果在给定的超时时间内完成,则解析为 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 上都受支持。

    【讨论】:

      猜你喜欢
      • 2019-05-15
      • 2013-05-13
      • 1970-01-01
      • 2013-01-05
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多