Каков идиоматический способ реализации вызовов aWait в ClojureScript? - PullRequest
0 голосов
/ 15 мая 2018

Я хочу вызвать асинхронный API в javascript, который использует обратные вызовы, используя синтаксис, похожий на 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 для возврата Обещаний.

1 Ответ

0 голосов
/ 15 мая 2018

Попробуйте библиотеку promesa . Он использует макросы, которые дают вам почти тот синтаксис, который вы ищете, и, как вы предлагаете, он не такой тяжелый, как core.async. (Использование обещаний вместо 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 ... ))))
...