在 ClojureScript 中实现 aWait 调用的惯用方法是什么?



我想在javascript中调用一个异步api,它使用类似于aWait的语法使用回调:

try {
let a = await asyncFunction1("foo");
let b = await asyncFunction2("bar", a);
do something ...
}
catch (e) {
handle errors ...
}

在 clojureScript 中,它可能类似于:

(try 
(let [a  (await (asyncFunction1 "foo"))
b  (await (asyncFunction2 "bar" a))]
do something ...)
(catch :default e 
handle errors ... ))

对于这种简单的代码模式,core.async库似乎有点矫枉过正。我找到了一些库,但它们是版本0.1.0-SNAPSHOT。如有必要,我可以转换 api 调用以返回承诺。

试试普罗米萨库。 它使用宏几乎完全可以为您提供所需的语法,并且正如您所建议的,它不像core.async那样重量级。 (使用 promise 而不是 core.async 还具有更自然地处理异常和更好的堆栈跟踪的优点。

语法是这样的:

(require '[promesa.core :as p])
(p/alet
(-> (p/alet [a  (p/await (asyncFunction1 "foo"))
b  (p/await (asyncFunction2 "bar" a))]
do something ...)
(catch (fn [error] 
handle errors ... ))))

相关内容

最新更新