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

时间:2018-02-10 19:23:36

标签: local-storage elm

我正在尝试使用以下代码从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的问题。

在这里做什么的任何想法?

1 个答案:

答案 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