ClojureScript/Reagent中go块内匿名JS函数失效问题排查
问题分析与解决
你写的匿名函数只是被定义出来了,但根本没调用——go块里的代码是按顺序执行表达式,(fn [] ...)这个表达式的结果是一个函数对象,但不会自动执行里面的逻辑,所以第三方库的方法根本没被触发。
两种修正方式:
直接执行代码(不需要函数包裹的情况)
如果没必要用匿名函数,直接把调用逻辑写出来就行:(go (js/console.log "going") (<! (timeout 3000)) ^js (.function (.somedata @lib)) ; 直接执行方法调用 (js/console.log "landed") )必须用函数时,手动调用它
如果确实需要用匿名函数(比如需要延迟捕获变量、做封装),要在定义后加一对括号执行:(go (js/console.log "going") (<! (timeout 3000)) ((fn [] ^js (.function (.somedata @lib)))) ; 定义后立即调用 (js/console.log "landed") )
你之前换成console.log能正常运行,是因为那是直接执行的语句,而不是定义了一个函数却不调用。
内容的提问来源于stack exchange,提问作者txesc
相关产品推荐
相关产品推荐

