【发布时间】:2016-08-19 10:40:17
【问题描述】:
我需要在我的“更新”函数中运行一个计算量非常大的代码。
当它运行时,我的整个应用程序会阻塞,直到它完成。
有没有办法异步运行这段代码来防止阻塞? (虽然不使用端口并留在榆树)
【问题讨论】:
-
目前看起来有点讨厌,如果可以的话,我宁愿找到另一种方法。您不能传递更复杂类型的 elm only 字符串
标签: javascript asynchronous concurrency elm
我需要在我的“更新”函数中运行一个计算量非常大的代码。
当它运行时,我的整个应用程序会阻塞,直到它完成。
有没有办法异步运行这段代码来防止阻塞? (虽然不使用端口并留在榆树)
【问题讨论】:
标签: javascript asynchronous concurrency elm
Elm 任务不支持抢先式多任务。
使用Process.spawn,您可以构建在用作Task.andThen 的参数时将进行上下文切换的任务。
但是,对于这些,您必须在结果任务的类型为 Task x Process.Id 的约束范围内工作,这意味着没有简单的方法可以将您的任务结果传回主应用程序。
请参阅the documentation 以获取Process.Id。
【讨论】:
您可以尝试将其作为任务运行。可以先发制人地停止任务以执行应用程序的其他部分,尽管我不确定在某些使用全部 CPU 容量的情况下它们将如何工作:
DoHeavyStuff a b ->
let
task param1 param2 =
Task.succeed 1
`Task.andThen` (\_ -> Task.succeed <| expensive param1 param2)
in
(model, Task.perform NoOp FinishedWork (task a b))
FinishedWork result ->
...
【讨论】:
Task.suceed 1 andThen \_ -> expensive
andThen 的右侧需要一个返回任务的函数而不是返回结果的函数:/ 似乎我们无法以这种方式摆脱它