Я написал простую функцию обратного вызова (обработчика), которую я передаю асинхронному API, и я хочу дождаться результата:
object Handlers {
val logger: Logger = Logger("Handlers")
implicit val cs: ContextShift[IO] =
IO.contextShift(ExecutionContext.Implicits.global)
class DefaultHandler[A] {
val response: IO[MVar[IO, A]] = MVar.empty[IO, A]
def onResult(obj: Any): Unit = {
obj match {
case obj: A =>
println(response.flatMap(_.tryPut(obj)).unsafeRunSync())
println(response.flatMap(_.isEmpty).unsafeRunSync())
case _ => logger.error("Wrong expected type")
}
}
def getResponse: A = {
response.flatMap(_.take).unsafeRunSync()
}
}
Но по какой-то причине и tryPut, и isEmpty (когда я вручную вызываю метод onResult) возвращают true, поэтому, когда я вызываю getResponse, он спит навсегда. Это мой тест:
class HandlersTest extends FunSuite {
test("DefaultHandler.test") {
val handler = new DefaultHandler[Int]
handler.onResult(3)
val response = handler.getResponse
assert(response != 0)
}
}
Может кто-нибудь объяснить, почему tryPut возвращает true, но ничего не ставит. И как правильно использовать Mvar/channels в scala?