ClojureScript가 ECMAScript 2016을 대상으로 하게 되면서 JavaScript 상호운용성 개선 영역을 신중히 선택할 수 있게 됨
await를 사용해 Promise 값을 기다리는 ClojureScript 함수 작성이 가능해짐
(refer-global :only '[Promise])
(defn ^:async foo [n]
(let [x (await (Promise/resolve 10))
y (let [y (await (Promise/resolve 20))]
(inc y))
;; not async
f (fn [] 20)]
(+ n x y (f))))
테스트에도 ^:async를 사용할 수 있으며, await로 비동기 함수 호출 결과를 검증할 수 있음
(deftest ^:async defn-test
(try
(let [v (await (foo 10))]
(is (= 61 v)))
(let [v (await (apply foo [10]))]
(is (= 61 v)))
(catch :default _ (is false))))
배경과 변경 목록
최근 Clojure 설문에서 async functions 지원이 JavaScript 상호운용성 관련 ClojureScript 개선 요구 중 가장 높은 비중을 차지함
이번 개선으로 최신 브라우저 API와 인기 라이브러리를 다루는 일반적인 경우 추가 의존성을 도입할 필요가 줄어듦