在Elm中使用NoMap在初始请求上使用http请求映射消息

时间:2018-07-02 20:58:00

标签: types functional-programming elm elm-architecture

我正在构建我的第一个Elm应用程序,并根据这些资料构建它:

How i structure elm apps

NoMap approach with Domain focus

这意味着我将Msg类型从主Types.elm映射到子函数。做一个简单的onClick函数时,看起来像这样

onClick (MsgForPieChart <| SelectSlice <| sliceModel.points)

现在,我想在init上获取一些数据以进行查看。

我尝试使用与简单的onClick函数相同的方法

getWarAndPeace : Cmd Msg
getWarAndPeace =
    Http.send (MsgForMuseums <| FetchedMuseums) <|
        Http.getString "https://example.com/books/war-and-peace.md"

我的主要类型如下:

type Msg
= MsgForPieChart Atom.PieChart.Types.Msg
| MsgForMuseums Organism.Museums.Types.Msg 
| NoOp

对于http请求,我的子函数类型看起来像这样

type Msg = 
FetchedMuseums (Result Http.Error String)

但是无论我尝试什么,我都会不断从Http.sendTask或类似的方法中得到类似的类型错误

Result Http.Error a -> App.Types.Msg

但这是

App.Types.Msg

我的更新功能的结构如下:

update : App.Types.Msg -> Organism.Museums.Types.MuseumsModel -> Organism.Museums.Types.MuseumsModel
update msgFor model =
case msgFor of
    MsgForMuseums msg ->
        updateMuseums msg model
    _ ->
        model


updateMuseums : Organism.Museums.Types.Msg -> Organism.Museums.Types.MuseumsModel -> Organism.Museums.Types.MuseumsModel
updateMuseums msg model =
    case msg of
        FetchedMuseums data -> model

那么我如何在子函数的init上获取http请求,该函数使用NoMap模式组合Msg

1 个答案:

答案 0 :(得分:1)

使用Dogbert建议的Http.send (MsgForMuseums << FetchedMuseums)确实解决了该问题