1

我知道我可以通过调用来获取当前正在执行的光纤的 ID

ZIO.descriptor.map(_.id)

但是,我想要的是一个不纯的函数,我可以从副作用代码中调用它,让我们像这样定义它

def getCurrentFiberId(): Option[FiberId]

以便

for {
  fiberId <- ZIO.descriptor.map(_.id)
  maybeId <- UIO(getCurrentFiberId())
} yield maybeId.contains(fiberId)

产生真实的。是否可以定义这样的函数,如果可以,如何定义?请注意,此问题与如何从 ZIO 中的副作用代码访问光纤本地数据密切相关。

4

1 回答 1

0

不可能。该信息包含在一个名为的类的实例中,该类FiberContext实际上是Runtime负责解释效果的 ZIO 的核心。

此外,此类是内部实现并且可以理解为包私有。

此外,它不仅有一个实例,而且每次您unsafeRun使用效果时都会有一个实例,并且每次fork解释 a 时都会有一个实例。

由于效果的执行未绑定到线程,ThreadLocal未使用,因此,没有希望以您想要的方式提取该信息。

于 2020-04-21T13:27:34.350 回答