我正在尝试使用以下代码从 localstorage 加载 json:
let
val = Storage.getItem "exercises" decodeExerciseList
in
({ model | exercises = val }, Cmd.none)
但我收到此错误:
本次第 5 和第 6 分支
case
产生不同类型的值。 - 第 5 个分支具有这种类型:( Model, Cmd Msg )
但第 6 个是:
( { exercise : Maybe Model.Exercise
, exercises : Task String (List Model.Exercise)
}
, Cmd msg
)
我想也许这会有所帮助:
case val of
succeed -> ({ model | exercises = val }, Cmd.none)
fail -> ({model | exercises = []}, Cmd.none)
但没有运气。在这种情况下,我遇到了另一个错误:
这个
case
的第一和第二分支产生不同类型的值。 - 第一个分支有这种类型:( { ..., exercises : Task String (List Model.Exercise) }, Cmd msg )
但第二个是:
( { ..., exercises : List a }, Cmd msg )
所以基本上我仍然遇到任务字符串 X 而不仅仅是 X 的问题。
知道在这里做什么吗?
最佳答案
尽管本地存储在 javascript 中是同步访问的,但这种访问仍然是不纯的,因此如您所见,在 Elm 中使用任务进行处理。
所以你的代码需要分两个阶段工作
- 启动任务
- 使用返回的结果
类似于以下内容
type Msg
= LoadFromStorage
| OnLocalStorage (Result String (List Model.Exercise))
update message model =
case message of
LoadLocalStorage ->
( model
, Storage.getItem "exercises" decodeExerciseList
|> Task.attempt OnLocalStorage
)
OnLocalStorage res ->
case res of
Ok val ->
({ model | exercises = val }, Cmd.none)
Err err ->
handle error
关于local-storage - 如何从(任务字符串值)中获取值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48724701/