Elm:如何在后续请求中使用来自一个HTTP请求的数据

Elm:如何在后续请求中使用来自一个HTTP请求的数据,elm,Elm,我刚接触Elm,刚读过文档()。我正在修改其中的一个示例,并在其中进行讨论。 我想做的是点击一个端点,它会给我一个ID列表。稍后我想用这些ID中的每一个点击另一个端点并显示结果 - 此端点有一个ID列表 - 该端点将给出给定ID的故事细节 用我现在所拥有的,我可以分别得到所有ID的列表,我可以分别得到每个故事(硬编码ID)并显示它们。但我在这里试图实现的是 从端点1获取ID列表(其中500个) 通过点击端点2获得前5个故事 有一个“加载更多”按钮,将加载5个以上,以此类推 我不知道该怎么做。

我刚接触Elm,刚读过文档()。我正在修改其中的一个示例,并在其中进行讨论。 我想做的是点击一个端点,它会给我一个ID列表。稍后我想用这些ID中的每一个点击另一个端点并显示结果

- 此端点有一个ID列表

- 该端点将给出给定ID的故事细节

用我现在所拥有的,我可以分别得到所有ID的列表,我可以分别得到每个故事(硬编码ID)并显示它们。但我在这里试图实现的是

  • 从端点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)”或其他列表操作?请查看的类型注释。您需要使用案例语句来确定结果是否成功。这看起来很像上面的案例陈述。