gpt4 book ai didi

elm - 如何在页面加载时过滤信号

转载 作者:行者123 更新时间:2023-12-02 21:00:22 25 4
gpt4 key购买 nike

为了学习,我尝试仅在单击按钮时加载内容。到目前为止,我已经成功:

  • 单击按钮时重新加载内容。
  • 当我点击时过滤信号(如果我发送的字符串不是“GETPERF”)

但我的问题是,一旦页面加载,Ajax 调用仍然会被触发。

代码如下:

-- SIGNALS & MAILBOX

inbox : Signal.Mailbox String
inbox =
Signal.mailbox "SOME TEXT"

result : Signal.Mailbox String
result =
Signal.mailbox ""

-- VIEW

view : String -> Html
view msg =
div [] [
h1 [] [text "Mailbox3"],
p [] [text msg],
button
[onClick inbox.address "GETPERF"]
[text "click perf"],
]

main : Signal Html
main =
Signal.map view result.signal

-- TASK & EFFECTS

port fetchReadme : Signal (Task Http.Error ())
port fetchReadme =
inbox.signal
|> Signal.filter (\sig -> sig == "GETPERF" ) "boo"
|> Signal.map (\_ -> Http.getString "http://localhost:3000/dates" `andThen` report)


report : String -> Task x ()
report html =
Signal.send result.address html

有什么方法可以阻止页面加载时的第一个 Ajax 调用吗? (或者一些更惯用的方法来完成这一切?)

最佳答案

您收到初始 ajax 请求的原因是 Signal.filter 仍然保留 "boo" 的初始值(请参阅 Signal.filter documentation here )。通过使用下划线参数,该值将在下一个 Signal.map 语句中被忽略,但 Http 任务仍会返回,这就是您在页面加载时看到初始 ajax 请求的原因。

您可以编写一个条件,仅在正确的情况下(当 sig"GETPERF"< 时发送 ajax 请求,而不是使用 Signal.filter)/。如果 sig 不是 "GETPERF"(如页面加载),本质上,您可以通过返回 Task 不执行任何操作.succeed()。下面是经过这些更改的重构的 fetchReadme 函数:

port fetchReadme : Signal (Task Http.Error ())
port fetchReadme =
let
fetchAndReport sig =
if sig == "GETPERF" then
Http.getString "http://localhost:3000/dates"
`andThen` report
else
Task.succeed ()
in
Signal.map fetchAndReport inbox.signal

关于elm - 如何在页面加载时过滤信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34660306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com