【问题标题】:What is the idiomatic way to implement aWait calls in ClojureScript?在 ClojureScript 中实现 aWait 调用的惯用方式是什么?
【发布时间】:2018-05-16 00:33:07
【问题描述】:

我想在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。

【问题讨论】:

    标签: async-await es6-promise clojurescript


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2021-12-09
      • 1970-01-01
      • 2014-06-23
      • 2012-01-23
      • 2014-11-19
      • 2022-08-18
      • 2019-09-04
      • 2012-12-24
      • 1970-01-01
      相关资源
      最近更新 更多