У меня есть блок кода, который представляет собой небольшую модификацию фрагмента кода, приведенного в ScalaDoc для TaskLocal [оригинал здесь: https://monix.io/api/3.0/monix/eval/TaskLocal.html].
Мой код просто заменяет встроенную задачу (в пределах для понимания) со ссылкой на задачу, которая определена за пределами области понимания.К сожалению, когда моя задача выполняется, она не видит привязку, а вместо этого видит исходное значение (0).Я надеялся, что мой слегка измененный код (ниже) даст тот же результат, что и фрагмент из ScalaDoc.Но неожиданно я получаю «значение3: 4», а не значение3: 200. Кажется, мои ссылки на tlocal получают другую «версию» этой переменной threadlocal-ish, которая по умолчанию имеет значение init'd и ничего не знает о привязке.
CODE
class MonixTests extends FlatSpecLike with Matchers {
"TaskLocal" should "not make me sad " in {
val tlocal: Task[TaskLocal[Int]] = TaskLocal(0)
val readTask: Task[Int] =
tlocal.flatMap {
taskLocal: TaskLocal[Int] =>
taskLocal.read.map{ i => i * 2 }
}
val task: Task[Unit] =
for {
local <- tlocal
value1 <- local.read // value1 == 0
_ <- local.write(100)
value2 <- local.read // value2 == 100
value3 <- local.bind(200)(readTask)
value4 <- local.read // value4 == 100
_ <- local.clear
value5 <- local.read // value5 == 0
} yield {
// Should print 0, 100, 400, 100, 0 -- but value3 is not 400, but 4
println("value1: " + value1)
println("value2: " + value2)
println("value3: " + value3)
println("value4: " + value4)
println("value5: " + value5)
}
import monix.execution.Scheduler.Implicits.global
implicit val opts = Task.defaultOptions.enableLocalContextPropagation
task.runToFutureOpt
println(" TRY AGAIN a slightly different way, but no success ;^( ")
val task3: Task[Unit] =
for {
local <- tlocal
value1 <- local.read // value1 == 0
_ <- local.write(100)
value2 <- local.read // value2 == 100
value3 <- local.bind(200)(readTask)
value44 <- local.bind(200) (
tlocal.flatMap {
taskLocal: TaskLocal[Int] =>
taskLocal.read.map{i => i * 2}
}
)
_ <- local.clear
value5 <- local.read // value5 == 0
} yield {
// Should print 0, 100, 400, 100, 0 -- but value3 is not 400, but 4
println("value1: " + value1)
println("value2: " + value2)
println("value3: " + value3)
println("value4: " + value44)
println("value5: " + value5)
}
task3.runToFutureOpt
}
Обоснование:
Причина, по которой я хочу это сделать, заключается в том, что я хочу привязать значение к локальному потокузатем создайте цепочку задач, в которой некоторые из этих задач извлекают текущее значение локального потока, которое, как я понимаю, передано TaskLocal.И, чтобы было ясно, некоторые из этих задач определены в других классах в моей кодовой базе, и не включены в рамки какого-либо конкретного для понимания.
спасибо!/ * Крис 1016 *