local-storage - 如何从(任务字符串值)中获取值?

标签 local-storage elm

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

相关文章:

types - 什么是 `init : () -> (Model, Cmd Msg)` 注释?

elm - 如何避免 elm 中自定义类型和字符串之间的往返?

elm - 在 let 表达式中使用 elm 进行反跳

angularjs - 使用angularjs上传图像并保存在本地存储中

jquery - HTML5 localstorage 在登录框中记住我

javascript - 将输入字段转换为数组并保存到本地存储

javascript - 使用 Moment.js 制作原生 ELM 模块

angularjs - Angular 缓存未按预期工作

javascript - Android - WebView html5 localstorage 在应用程序更新后不持久

elm - Elm中如何实现继承