在 ClojureScript 中实现 aWait 调用的惯用方法是什么?
What is the idiomatic way to implement aWait calls in ClojureScript?
我想在 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 调用转换为 return Promises。
试试 promesa library。它使用宏,几乎可以为您提供您正在寻找的语法,而且正如您所建议的,它不像 core.async 那样重量级。 (使用 promises 而不是 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 ... ))))
我想在 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 调用转换为 return Promises。
试试 promesa library。它使用宏,几乎可以为您提供您正在寻找的语法,而且正如您所建议的,它不像 core.async 那样重量级。 (使用 promises 而不是 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 ... ))))