TPromise
是一个可以设置一次,并且可以参与 STM 事务的可变参考。
创建一个 TPromise
创建一个 TPromise
:
import zio._
import zio.stm._
val tPromise: STM[Nothing, TPromise[String, Int]] = TPromise.make[String, Int]
结束一个 TPromise
成功完成 TPromise:
import zio._
import zio.stm._
val tPromiseSucceed: UIO[TPromise[String, Int]] = for {
tPromise <- TPromise.make[String, Int].commit
_ <- tPromise.succeed(0).commit
} yield tPromise
得到一个失败的 TPromise:
import zio._
import zio.stm._
val tPromiseFail: UIO[TPromise[String, Int]] = for {
tPromise <- TPromise.make[String, Int].commit
_ <- tPromise.fail("failed").commit
} yield tPromise
另外,您也可以使用 done
组合器,并通过传递 Either[E, A]
来完成 Promise:
import zio._
import zio.stm._
val tPromiseDoneSucceed: UIO[TPromise[String, Int]] = for {
tPromise <- TPromise.make[String, Int].commit
_ <- tPromise.done(Right(0)).commit
} yield tPromise
val tPromiseDoneFail: UIO[TPromise[String, Int]] = for {
tPromise <- TPromise.make[String, Int].commit
_ <- tPromise.done(Left("failed")).commit
} yield tPromise
设置它的值后,之后任何尝试对其进行设置的操作都会返回 false
。
从一个 TPromise 中得到值
如果 Promise 已经完成,则返回结果,否则返回 None:
import zio._
import zio.stm._
val tPromiseOptionValue: UIO[Option[Either[String, Int]]] = for {
tPromise <- TPromise.make[String, Int].commit
_ <- tPromise.succeed(0).commit
res <- tPromise.poll.commit
} yield res
或者,您可以(阻塞)等待 Promise 的完成并将值返回:
import zio._
import zio.stm._
val tPromiseValue: IO[String, Int] = for {
tPromise <- TPromise.make[String, Int].commit
_ <- tPromise.succeed(0).commit
res <- tPromise.await.commit
} yield res