2024 年 Clojure 调查问卷中分享您的想法!

欢迎!有关如何工作的更多信息,请参阅关于页面。

+6
ClojureScript

关于在 ClojureScript 中添加 ES2018 async/await 的讨论在网络上有很多,无论是功能请求[1][2],提案[3],还是实验[4][5]。

我提出这个问题是为了有一个中央地方,让人们可以投票并引起 Clojure 核心团队的关注,并可能帮助优先考虑这个功能的考虑。

我知道这不是像添加关键字到生成的 JS 代码那么简单。我知道使用 promesa、core.async 或 kitchen-async 的宏作为解决方案。我也知道必须有一个强大的用例来考虑添加这个功能。我在下面的链接中提到的所有这些,以及更多,都已经在某个时候进行过讨论。

[1] https://groups.google.com/g/clojurescript/c/scUMhU-ctEM
[2] https://www.reddit.com/r/Clojure/comments/f4nlau/clojurescript_and_asyncawait/
[3] https://observablehq.com/@shaunlebron/proposal-generators-and-async-functions-in-clojurescript#blockers
[4] https://twitter.com/roman01la/status/1155602189311717377
[5] https://twitter.com/borkdude/status/1639579880336621570

请注意,Squint 和 Cherry 都支持 async/await:https://github.com/squint-cljs/cherry

但是,我应该支持 `js-await` 这个名字,因为考虑到有 js-delete 等情况,这个名字更有意义。

如果 CLJS 核心团队决定想要有 async/await,我愿意承担实施它的任务(因为我已经在 cherry/squint 中解决过这个问题,我认为这不会花我多少时间)。

不过,与此同时,Promesa 是相当不错的。

1 个答案

+3

请注意,shadow-cljs 已支持 js-await 一段时间了。

请查看此公告贴子
https://clojureverse.org/t/promise-handling-in-cljs-using-js-await/8998

这并不完全等同于 async/await,但我觉得它不需要这样。
它被实现为一个相当简单的宏1。它具有相同的语法语义,而且绝对没有必要将任何函数“标记”为异步。它只是因为返回了一个承诺而变得异步。

我认为把编译器改为生成实际的 async/await 的代码不值得花费力气。这个宏让你用1%的努力就得到了90%的解决方案。对于像 promesa 这样的库也是同样的道理。这很容易在用户空间中解决。

...