我正在尝试使用以下代码从localstorage加载json:
let
val = Storage.getItem "exercises" decodeExerciseList
in
({ model | exercises = val }, Cmd.none)
但我收到此错误:
这个case
的第5和第6个分支产生不同类型的值。 - 第5个分支有这种类型:
( Model, Cmd Msg )
但第六是:
( { 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
的第1和第2个分支产生不同类型的值。 - 第一个分支有这种类型:
( { ..., exercises : Task String (List Model.Exercise) }, Cmd msg )
但第二是:
( { ..., exercises : List a }, Cmd msg )
所以基本上我仍然遇到任务字符串X而不是X的问题。
在这里做什么的任何想法?
答案 0 :(得分:7)
尽管localstorage是在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