Написание собственной функции syntati c sugar для работы с Await.result - PullRequest
2 голосов
/ 28 февраля 2020

Как я могу преобразовать это:

Await.result(purchase, 5 seconds)

Чтобы иметь возможность написать то же утверждение следующим образом:

purchase.await(5 seconds)

Просто пытаюсь научиться переписывать некоторые из моих код, написав свой собственный DSL.

Ответы [ 2 ]

4 голосов
/ 28 февраля 2020

Вы можете создать свой собственный неявный класс :

import scala.concurrent.{Await, Awaitable}
import scala.concurrent.duration.Duration

object syntax {
  object await {
    implicit class AwaitableOps[T](private val awaitable: Awaitable[T]) extends AnyVal {
      @inline
      final def await(atMost: Duration): T =
        Await.result(awaitable, atMost)
    }
  }
}

, который вы можете использовать следующим образом:

import syntax.await._
purchase.await(5.seconds) // Note the dot. The postFix operator syntax is discouraged.
3 голосов
/ 28 февраля 2020

В Scala 3 вы можете написать метод расширения примерно так

def [T](f: Future[T]).await(atMost: Duration) = Await.result(f, atMost)

scast ie пример

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