如何从(任务字符串值)获取值?

tia*_*dll 4 local-storage elm

我正在尝试使用以下代码从localstorage加载json:

let 
    val = Storage.getItem "exercises" decodeExerciseList
in 
    ({ model | exercises = val }, Cmd.none)
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个错误:第5和第6个分支case产生了不同类型的值. - 第5分支有这种类型:

( Model, Cmd Msg )
Run Code Online (Sandbox Code Playgroud)

但第六是:

( { exercise : Maybe Model.Exercise
, exercises : Task String (List Model.Exercise)
}
, Cmd msg
)
Run Code Online (Sandbox Code Playgroud)

我想也许这可能会有所帮助:

case val of
    succeed -> ({ model | exercises = val }, Cmd.none)
    fail -> ({model | exercises = []}, Cmd.none)
Run Code Online (Sandbox Code Playgroud)

但没有运气.在这种情况下,我得到了另一个错误:

第一和第二分支case产生不同类型的值. - 第一个分支有这种类型:

( { ..., exercises : Task String (List Model.Exercise) }, Cmd msg )
Run Code Online (Sandbox Code Playgroud)

但第二是:

( { ..., exercises : List a }, Cmd msg )
Run Code Online (Sandbox Code Playgroud)

所以基本上我仍然遇到任务字符串X而不是X的问题.

什么在这做什么的想法?

Sim*_*n H 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
Run Code Online (Sandbox Code Playgroud)