You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:06:04