对不起新手的问题(和我的英语):)
我尝试编写以下函数:
- 该函数从URL1下载内容(作为参数接收)
- 该函数解析此内容并提取URL2
- 该函数从URL2下载内容
- URL2的内容是这个函数的结果
- 如果发生错误,此函数应返回 Nothing
我知道如何执行 HTTP 请求。我有一个函数来解析来自URL1的请求。但我不知道如何:
- 使用提取的URL2执行新请求
- 如果未提取URL2 (或URL1中发生错误) ,则忽略第二个请求
我原则上你想要这样的东西:
import Maybe
import Http
type Url = String
getContentFromUrl : Maybe Url -> Maybe String
getContentFromUrl url = --your implementation
extractUrlFromContent : Maybe String -> Maybe Url
extractUrlFromContent content = --your implementation
content = getContentFromUrl (Just "http://example.com")
|> extractUrlFromContent
|> getContentFromUrl
发送 Http 意味着与外界对话,这涉及到Signal
Elm 中的 s。因此,来自URL2的最终结果将打包在一个Signal
. 只要您对此感到满意,您就可以使用 Maybe 返回 in a Maybe
in a的内容Signal
。例如:
import Maybe
import Http
-- helper functions
isSuccess : Http.Response a -> Bool
isSuccess response = case response of
Http.Success _ -> True
_ -> False
responseToMaybe : Http.Response a -> Maybe.Maybe a
responseToMaybe response = case response of
Http.Success a -> Just a
_ -> Nothing
parseContentAndExtractUrl : String -> String
parseContentAndExtractUrl = identity -- this still requires your implementation
-- URL1
startUrl : String
startUrl = "www.example.com" -- replace this with your URL1
result1 : Signal (Http.Response String)
result1 = Http.sendGet <| constant startUrl
-- URL2
secondUrl : Signal String
secondUrl = result1
|> keepIf isSuccess (Http.Success "")
|> lift (\(Http.Success s) -> s)
|> lift parseContentAndExtractUrl
result2 : Signal (Maybe String)
result2 = secondUrl
|> Http.sendGet
|> lift responseToMaybe
请注意,有计划使所有这些更容易使用:https ://groups.google.com/d/topic/elm-discuss/BI0D2b-9Fig/discussion