如何在ClojureScript中绑定Javascript承诺的解析值

如何在ClojureScript中绑定Javascript承诺的解析值,javascript,promise,clojurescript,Javascript,Promise,Clojurescript,如何将Javascript承诺的解析返回值(在本例中是json对象)绑定到let块中?我得到的只是一个#对象[Promise[object Promise]] 例如: (.then (fn-that-returns-a-js-promise) #(print (.-prop %))) 将prop的值打印到控制台,同时: (let [prop (.then (fn-that-returns-a-js-promise) #(.-prop %))] (print prop)) 打印#对象[Pro

如何将Javascript承诺的解析返回值(在本例中是json对象)绑定到let块中?我得到的只是一个
#对象[Promise[object Promise]]

例如:

(.then (fn-that-returns-a-js-promise) #(print (.-prop %))) 
prop
的值打印到控制台,同时:

(let [prop (.then (fn-that-returns-a-js-promise) #(.-prop %))] (print prop))
打印
#对象[Promise[object Promise]]

您无法绑定它

(.then (fn-that-returns-a-js-promise) #(.-prop %))

返回javascript承诺。承诺上的每个操作都会返回新的承诺,并且您的程序逻辑在该承诺的上下文中执行,您无法逃避它。

但是调用print显然会强制它?@mac
。那么(fn)
的返回值始终是一个承诺,不管您传递给它的是什么函数。这是JavaScript的一个“限制”,而不是ClojureScript。在您的第一个表达式中,print在promise中被调用,一旦原始promise被释放,它将被执行(打印)。你的第二个表达式只是表达了承诺,而不是它的价值。该值可以通过promise本身访问,谢谢您的评论。为什么第二个回调中的属性访问不返回值而不是承诺?它毕竟是在承诺的“内部”执行的。它返回的是值,但“包装”在承诺的内部。如果要读取值,需要从承诺中访问它:
(.then(.then(fn-that-returns-a-js-promise)#(.-prop%))(fn[x](println x))
。承诺内的值无法从承诺外逃逸,必须将承诺链接起来以对其进行操作(每次调用都返回新的承诺)