Elm:如何在后续请求中使用来自一个HTTP请求的数据
我刚接触Elm,刚读过文档()。我正在修改其中的一个示例,并在其中进行讨论。 我想做的是点击一个端点,它会给我一个ID列表。稍后我想用这些ID中的每一个点击另一个端点并显示结果 - 此端点有一个ID列表 - 该端点将给出给定ID的故事细节 用我现在所拥有的,我可以分别得到所有ID的列表,我可以分别得到每个故事(硬编码ID)并显示它们。但我在这里试图实现的是Elm:如何在后续请求中使用来自一个HTTP请求的数据,elm,Elm,我刚接触Elm,刚读过文档()。我正在修改其中的一个示例,并在其中进行讨论。 我想做的是点击一个端点,它会给我一个ID列表。稍后我想用这些ID中的每一个点击另一个端点并显示结果 - 此端点有一个ID列表 - 该端点将给出给定ID的故事细节 用我现在所拥有的,我可以分别得到所有ID的列表,我可以分别得到每个故事(硬编码ID)并显示它们。但我在这里试图实现的是 从端点1获取ID列表(其中500个) 通过点击端点2获得前5个故事 有一个“加载更多”按钮,将加载5个以上,以此类推 我不知道该怎么做。
- 从端点1获取ID列表(其中500个)
- 通过点击端点2获得前5个故事
- 有一个“加载更多”按钮,将加载5个以上,以此类推
谢谢您可以在处理来自第一个端点的响应时触发第二个请求。比如:
type Msg
= GotIds (Result Http.Error (List Int))
| GotStory (Result Http.Error (String))
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
GotIds result ->
case result of
Ok (first::rest) ->
({ model | ids = first::rest }, getStory first)
Ok _ ->
(model, Cmd.none)
Err _ ->
({ model | story = "ERROR"}, Cmd.none)
GotStory result ->
({model | story = Result.withDefault "None" result}, Cmd.none)
如果要同时触发多个Cmd,可以使用
从第一个请求获取ID,然后获取第一个ID的标题
您需要为每个帖子创建自定义类型和
为了子孙后代,以下是来自Ellie的所有代码:
module Main exposing (main)
import Browser
import Html exposing (Html, button, div, text)
import Html.Events exposing (onClick)
import Http
import Json.Decode exposing (Decoder, field, int, list, string )
type alias Model =
{ ids : List Int
, story : String
}
initialModel : Model
initialModel =
{ ids = []
, story = "None"
}
type Msg
= GotIds (Result Http.Error (List Int))
| GotStory (Result Http.Error (String))
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
GotIds result ->
case result of
Ok (first::rest) ->
({ model | ids = first::rest }, getStory first)
Ok [] ->
(model, Cmd.none)
Err _ ->
({ model | story = "ERROR"}, Cmd.none)
GotStory result ->
({model | story = Result.withDefault "None" result}, Cmd.none)
view : Model -> Html Msg
view model =
div []
[ text model.story
]
main : Program () Model Msg
main =
Browser.element
{ init = init
, view = view
, update = update
, subscriptions = (\_ -> Sub.none)
}
init : () -> (Model, Cmd Msg)
init flags =
(initialModel, getIds)
getIds : Cmd Msg
getIds =
Http.get
{ url = "https://hacker-news.firebaseio.com/v0/topstories.json"
, expect = Http.expectJson GotIds (list int)
}
getStory : Int -> Cmd Msg
getStory id =
Http.get
{ url = "https://hacker-news.firebaseio.com/v0/item/" ++ String.fromInt id ++ ".json"
, expect = Http.expectJson GotStory (field "title" string)
}
谢谢你的回答。这是否意味着每次我想获取故事时都应该请求ID?是否有一种方法可以在用户每次单击“加载更多”时存储ID并循环和请求故事?因此,我将在页面加载时请求一次ID,然后将该数据用于其他请求。@Varshith ID存储在模型上<代码>{model | ids=first::rest}。这就是Elm管理状态的方式:所有状态都在模型上。您需要将另一个变量添加到Msg中,以处理用户单击“加载更多”时的情况。使用“remoteData”包时,其不同。如何将“WebData(List a)”用作“List a”,以便能够使用“(first::rest)”或其他列表操作?请查看的类型注释。您需要使用案例语句来确定结果是否成功。这看起来很像上面的案例陈述。