如何让ClojureScript的go块返回Promise供Node.js侧await调用
解决方案
ClojureScript 侧代码实现
直接修改foo函数如下即可:
(require '[cljs.core.async :refer [go take!]]) ;; 简化版(适配你示例中返回1的逻辑) (defn foo [] (js/Promise. (fn [resolve _reject] (take! (go 1) resolve)))) ;; 适配实际业务逻辑的通用版本 (defn foo [] (js/Promise. (fn [resolve reject] (take! (go (try (let [x (<! ...)] ;; 替换为你实际的go块业务逻辑 x) (catch :default e (reject e)))) resolve))))
小提示:如果需要编译为Node.js可直接引入调用的模块,记得给函数添加导出标识,比如shadow-cljs编译环境下写法为
(defn ^:export foo [] ...)
逻辑说明
- 函数直接返回原生JavaScript Promise实例,和Node.js的异步语法完全兼容
- 利用core.async的
take!方法监听go块返回的通道,通道有值返回时直接调用Promise的resolve方法传递结果 - 通用版本额外增加了异常捕获逻辑,go块内执行出错时会调用Promise的reject方法,Node.js侧可以通过try catch捕获await抛出的异常
Node.js 侧调用方式
完全符合你的预期,不需要做任何修改:
async function nodefoo() { var x = await foo(); console.log(x); // 正常输出1 }
内容的提问来源于stack exchange,提问作者Takis
相关产品推荐
相关产品推荐

