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

时间:2018-05-15 14:51:13

标签: async-await es6-promise 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调用以返回Promises。

1 个答案:

答案 0 :(得分:2)

试试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 ... ))))