如何在 clojurescript 中使用 javascript 承诺?

Foo*_*Bar 1 interop clojurescript

我的 js 承诺有问题:我正在尝试转换此 js 代码:

stripe.createToken(card).then(function(result) {
    if (result.error) {
      // Inform the customer that there was an error.
      var errorElement = document.getElementById('card-errors');
      errorElement.textContent = result.error.message;
    } else {
      // Send the token to your server.
      stripeTokenHandler(result.token);
    }
Run Code Online (Sandbox Code Playgroud)

我有以下内容:

(go
     (let [result (<!
                   (.createToken stripe @(subscribe [:card-element]))
                   )]
       (prn "result is" result)
       ;; (if (.-error result)
       ;;   (.textContent (js/document.getElementById "card-errors") (.-message .-error result))
       ;;   (prn "response is" (js/stripeTokenHandler (.-token result)))
       ;;   )
       )
    )
Run Code Online (Sandbox Code Playgroud)

但我得到“没有为类型对象定义协议方法 ReadPort.take![object Promise]”

如何在 cljs 中执行 js .then() 部分?

Geo*_*ard 5

看来你对 JavaScript 互操作有点困惑。您可以查看参考资料部分下的备忘单JavaScript Interop

\n\n

以下是一些简单示例:

\n\n
JS                            CLJS\n\nobject.method(arg1, arg2) <=> (.method object arg1 arg2)\nobject.field              <=> (.-field object)\nobject.field = "foo"      <=> (set! (.-field object) "foo")\nobject.nested.field       <=> (.-field (.-nested object))\n
Run Code Online (Sandbox Code Playgroud)\n\n

为了提高可读性,您可以使用->箭头宏

\n\n
JS                            CLJS\n\nobject.method(arg1, arg2) <=> (.method object arg1 arg2)\nobject.field              <=> (.-field object)\nobject.field = "foo"      <=> (set! (.-field object) "foo")\nobject.nested.field       <=> (.-field (.-nested object))\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后您可以将示例重写为:

\n\n
object.nested.field       <=> (-> object .-nested .-field)\n
Run Code Online (Sandbox Code Playgroud)\n