Ваш код не добавляет тайм-аут к существующему будущему. Это невозможно. То, что вы делаете, это устанавливаете тайм-аут для ожидания этого будущего в указанной точке 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 .