TPromise

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
Leave a Reply
Your email address will not be published.
*
*

BACK TO TOP