Таймаут будущего в Scala. js - PullRequest
0 голосов
/ 21 апреля 2020

Мне нужно поместить тайм-аут на будущее в кросс-платформенном приложении JVM / JS. Этот тайм-аут будет использоваться только в тестах, поэтому решение для блокировки не будет таким уж плохим.

Я реализовал следующий фрагмент кода, чтобы сделать будущий тайм-аут на 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?

1 Ответ

1 голос
/ 21 апреля 2020

Ваш код не добавляет тайм-аут к существующему будущему. Это невозможно. То, что вы делаете, это устанавливаете тайм-аут для ожидания этого будущего в указанной точке c. Это можно воспроизвести другим, полностью асинхронным способом, создав будущее, которое

  • разрешится до 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...