gpt4 book ai didi

process - 从 Elm 进程接收消息

转载 作者:行者123 更新时间:2023-12-05 04:49:11 24 4
gpt4 key购买 nike

我在玩 Elm processes以便更多地了解它们的工作原理。在这一部分中,我正在尝试实现一个计时器。

但是,我遇到了一个障碍:我无法在其余代码中找到访问进程任务结果的方法。

有那么一瞬间,我希望如果我使用 Cmd 来解决任务,Elm 运行时将足够好地为我执行该效果,但这是一个天真的想法:

type Msg
= Spawned Process.Id
| TimeIsUp

init _ =
( Nothing
, Task.perform Spawned (Process.spawn backgroundTask)
)

backgroundTask : Task.Task y (Platform.Cmd.Cmd Msg)
backgroundTask =
Process.sleep 1000
-- pathetic attempt to send a Msg starts here
|> Task.map ( always
<| Task.perform (always TimeIsUp)
<| Task.succeed ()
)
-- and ends here
|> Task.map (Debug.log "Timer finished") -- logs "Timer finished: <internals>"

update msg state =
case msg of
Spawned id ->
(Just id, Cmd.none)

TimeIsUp ->
(Nothing, Cmd.none)

view state =
case state of
Just id ->
text "Running"

Nothing ->
text "Time is up"

docs

there is no public API for processes to communicate with each other.

我不确定这是否意味着进程无法与应用程序的其余部分通信。

有什么方法可以让 update 函数在进程退出后收到 TimeIsUp 吗?

最佳答案

有一种方法,但它需要 hell 之港:

  1. 从进程中发出伪造的 HTTP 请求,
  2. 然后通过 JavaScript 拦截它
  3. 并将其传递回 Elm。
port ofHell : (() -> msg) -> Sub msg

subscriptions _ =
ofHell (always TimeIsUp)

backgroundTask : Task.Task y (Http.Response String)
backgroundTask =
Process.sleep 1000
-- nasty hack starts here
|> Task.andThen ( always
<| Http.task { method = "EVIL"
, headers = []
, url = ""
, body = Http.emptyBody
, resolver = Http.stringResolver (always Ok "")
, timeout = Nothing
}
)

在幕后,Http.task 调用 new XMLHttpRequest(),因此我们可以通过重新定义该构造函数来拦截它。

<script src="elm-app.js"></script>
<div id=hack></div>
<script>
var app = Elm.Hack.init({
node: document.getElementById('hack')
})

var orig = window.XMLHttpRequest
window.XMLHttpRequest = function () {
var req = new orig()
var orig = req.open
req.open = function (method) {
if (method == 'EVIL') {
app.ports.ofHell.send(null)
}
return orig.open.apply(this, arguments)
}
return req
}
</script>

该解决方案尚未准备好生产,但它确实可以让您继续使用 Elm 流程。

关于process - 从 Elm 进程接收消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67679391/

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