After
метод запустит ваше будущее после некоторой задержки. duration
не является таймаутом, его стартовая задержка. After
способ внутренне использует scheduleOnce
способ актерсистема расписание.
After
- очень интересный метод, который начинает оценивать/исполнять ваше будущее выражение (например, value
) только после определенной заданной продолжительности.
Если заданная длительность очень мала, то она немедленно начинает выполнять value
.
Поскольку value
является параметром имени по имени, значение не оценивается сразу. value
будет оцениваться только при явном вызове по значению имени.
Адрес: akka lib.
def after[T](duration: FiniteDuration, using: Scheduler)(value: ⇒ Future[T])(implicit ec: ExecutionContext): Future[T] =
if (duration.isFinite() && duration.length < 1) {
try value catch { case NonFatal(t) ⇒ Future.failed(t) }
} else {
val p = Promise[T]()
using.scheduleOnce(duration) { p completeWith { try value catch { case NonFatal(t) ⇒ Future.failed(t) } } }
p.future
}
В основном ваша продолжительность будет вызывать следующий код
using.scheduleOnce(duration) { p completeWith { try value catch { case NonFatal(t) ⇒ Future.failed(t) } } }
Приведенный выше код будет приступить к выполнению в будущем после задержки (duration
задержка.).
Важные замечания:
отмечают, что value
является вызов параметром имя. значение будет оцениваться при вызове по имени, что означает, что ваше будущее не будет запускаться до тех пор, пока значение не будет вызвано явно. value
называется внутри try, потому что value
может быть многострочным выражением, которое содержит много кода и которое, наконец, возвращает будущее.
Promise (см. Код) заставит вас ждать незаметно, пока будущее не завершится его исполнением. promise.future
будет завершен только в том случае, если данное будущее завершено.
Что это связано с 'ask'? –
Ничего, @ m-z. Я только что отредактировал - спасибо. –