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

how to get the value from (Task String Value)?

我正在尝试使用以下代码从本地存储加载 json:

let 
    val = Storage.getItem "exercises" decodeExerciseList
in 
    ({ model | exercises = val }, Cmd.none)

但我收到此错误: 这个 case 的第 5 和第 6 个分支产生不同类型的值。 - 第 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