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() 部分?
看来你对 JavaScript 互操作有点困惑。您可以查看参考资料部分下的备忘单JavaScript Interop。
以下是一些简单示例:
\n\nJS 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))\nRun Code Online (Sandbox Code Playgroud)\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))\nRun Code Online (Sandbox Code Playgroud)\n\n然后您可以将示例重写为:
\n\nobject.nested.field <=> (-> object .-nested .-field)\nRun Code Online (Sandbox Code Playgroud)\n