协程和处理 clojure(script) 最佳实践中的异步?

Coroutines and handling async in clojure(script) best practices?

在 clojure 中似乎有无数的 'coroutines' 或异步逻辑的实现,Rich Hickey 和其他潜在权威关于这个问题的许多谈话都是近十年前的,我正在尝试找出处理此问题的最新、最好的最佳实践方法。

我最喜欢这种类型的抽象是 lua 协程,但我认为这些可能是一种严格的命令式做事方式,我对函数式方式是什么感到有点困惑.

在 lua 中,虽然使用协同程序非常简单易行:

A​​) 非忙等待 X 秒。

B) 非忙等待某个变量或函数为特定值,如true

A​​用setTimeout大概可以实现,B不行,至少我不知道怎么实现。我也不确定 setTimeout 是解决此类问题的最佳做法吗?

a 2013 blog post 中,Rich Hickey 描述了 clojure.core.async 的动机。虽然 JVM 有一些应用程序,但主要动机是给单线程 Javascript 环境带来线程的错觉。

clojure.core.async 提供的“模拟多线程”不如使用实际的 JVM 线程那么健壮(尤其是当 Exceptions/Errors 出现时),因此它对 JVM Clojure 的使用有限。当 Java virtual threads 成为现实时更是如此。

因此,如果您使用 ClojureScript,clojure.core.async 总比没有好得多(即回调地狱)。然而,即使是 JS 也在考虑 a multithreading model via WebAssembly,因此未来 ClojureScript 可能存在 clojure.core.async 的替代方案。