Вариант использования на самом деле довольно типичен. Многие веб-службы используют токены авторизации, которые вы получаете в начале сеанса, и вам необходимо отправлять их обратно при последующих запросах.
Я знаю, что могу сделать это так:
lazy val myData = {
val request = ws.url("/some/url").withAuth(user, password, WSAuthScheme.BASIC).withHeaders("Accept" -> "application/json")
Await.result(request.get().map{x => x.json }, 120.seconds)
}
Это просто кажется неправильным, так как все документы говорят, что мы никогда не ждем.
Есть ли способ справиться с этим в стиле Future/Promise Scala?
Я нашел .onComplete
, который позволяет мне запускать код после завершения обещания, однако без использования (изменяемого) var
я не вижу способа получить значение в этой области в lazy val
в другой области. Даже с var
возможна проблема с синхронизацией - отсюда и зло изменяемых переменных :)
Любой другой способ сделать это?
T
изFuture[T]
, объявление ее какlazy val
для меня ничего не меняет: либо вы используетеAwait
(с известным недостатком), либо не можете. - person cchantep   schedule 03.06.2016lazy val
. Я пытаюсь перевернуть вещи (сначала в своей голове), чтобы, как только это значение будет получено, я собрал все остальное, что мне нужно, в области.onComplete
и закончил обработку там. Учитывая, что нужно сделать и где это нужно сделать (внутри Актера), этот подход может помочь. - person Techmag   schedule 04.06.2016Future[T]
какlazy val
, но не уверен, что это действительно полезно - person cchantep   schedule 04.06.2016Action.sync {...}
, если проблем не будет. Однако, если я попытаюсь вызвать точно такой же код в триггере Актера с помощью задачи таймера, тогда код просто перестанет работать. Я не получаю блокировку, я просто получаю код, который падает с обрыва при первом вызове ws.url(). Таймеры продолжают работать, как и сам сайт, и все же Актер, кажется, никогда не делает реальных веб-вызовов. Пока не придумали, как это обойти... - person Techmag   schedule 05.06.2016dev
, оно тихо выходит из строя в режимеtestProd
по совершенно неизвестным причинам. Переместили этот вопрос в группы Google. - person Techmag   schedule 05.06.2016