[英]Is there any way to make an onClick handler in Om without using anonymous function?
[英]Using an anonymous Js function in a go block
我正在尝试在 clojurescript/reagent 中执行一些定时 animation 并且我正在尝试使用 core.async 来按顺序实现一系列定时步骤。 我正在使用第三方 js 反应库,因此,调用它的函数我使用的形式是 (fn [] ^js (.function (.something @ref))。但是将这个匿名 function 放在 go 块中以下不起作用 -
(go
(js/console.log "going")
(<! (timeout 3000))
(fn [] ^js (.function (.somedata @lib))
(js/console.log "landed")
)
这会正确计时返回“going”和“landed”,并且在放置另一个 console.log function 时可以正常工作。 但是,如果您将此 console.log 包装在 Fn 中,它将不再被调用。 它在组件的:on-click 处理程序中被调用。 我错过了什么?
那个^js
是没有必要的。
当您将某些内容包装在(fn []...)
中时,除非调用fn
,否则不会调用该内容。 即((fn []...))
。 但是,您最终创建了一个 function 并立即调用它,这是完全没有必要的。
因此,假设我理解正确,您可以简单地将(fn [] ^js...)
替换为(-> @lib.somedata.function)
。
在旁注中, somedata
听起来只是一个包含一些数据的字段,而不是需要调用的 function。 如果是这种情况,请使用.-somedata
而不是.somedata
。
正如 Eugene Pakhomov 所提到的,使用(fn []...)
只会创建一个 function,它不会调用它。 因此,它基本上只是完全消除而没有做任何事情。
您在这里的动机似乎摆脱了推理警告。 所以潜在的问题是core.async
在输入提示时相当健忘。 如果您问我,您根本不应该在go
块中进行任何互操作,而是将其全部移出。 通过defn
或本地 function 在go
之外。
(defn do-something []
(.function (.somedata ^js @lib)))
(go
(js/console.log "going")
(<! (timeout 3000))
(do-something)
(js/console.log "landed"))
(let [do-something (fn [] (.function (.somedata ^js @lib)))]
(go
(js/console.log "going")
(<! (timeout 3000))
(do-something)
(js/console.log "landed")))
另外,请注意。 为此使用 core.async 将大大增加为go
块中的代码生成的代码量。 如果你真的需要做的是延迟使用(js/setTimeout do-something 3000)
。 谨慎使用go
,它很容易为某些事情生成比通常需要的代码多 10 倍的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.