繁体   English   中英

在 go 块中使用匿名 Js 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM