【发布时间】:2020-04-19 11:07:28
【问题描述】:
我编写了简单的回调(处理程序)函数,我将它传递给异步 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,但什么都没有。在 scala 中使用 Mvar/channels 的正确方法是什么?
【问题讨论】:
标签: scala concurrency scala-cats side-effects