Yur*_*yov 6 javascript clojure node.js clojurescript electron
我正在编写一个Electron应用程序,在这个应用程序中,我需要与一些Node.js API进行交互 - 读取文件,获取目录条目,监听事件.
当然,我可以用编写JavaScript的方式编写ClojureScript,但是我想知道ClojureScripts对回调式API,流,EventEmitter采用什么,以及如何以不使用的方式编写有关node.js API的包装器.在ClojureScript中看起来很陌生.
再具体一点:
fs.readdir)根据我的经验,处理这些问题的最简单方法是使用core.async.
回调风格
例如,读取目录:
(def fs (js/require "fs"))
(defn read-dir [path]
(let [out (async/chan)]
(.readdir fs path
(fn [err files]
(async/put! (if err err files))
(async/close! out)))
out))
Run Code Online (Sandbox Code Playgroud)
我将结果传递给通道,即使结果是错误.这样,调用者可以通过执行来处理错误.例如:
(let [res (<! (read-dir "."))]
(if (instance? js/Error res)
(throw res)
(do-something res))
Run Code Online (Sandbox Code Playgroud)
在我自己的项目中,我使用cljs-asynchronize,它允许您将NodeJS回调样式函数转换为core.async兼容函数.例如,这与第一个示例相同:
(defn read-dir [path]
(asynchronize
(.readdir fs path ...)))
Run Code Online (Sandbox Code Playgroud)
最后,为了通过通道处理错误的更好方法,我个人发现"使用Clojure Async进行错误处理"非常有用.所以,您可以编写上面的错误处理代码,如:
(try
(let [res (<? (read-dir "."))]
(do-something res))
(catch js/Error e
(handle-error e))
Run Code Online (Sandbox Code Playgroud)
流
流API更简单:
(defn create-read-stream [path]
(let [out (async/chan)
stream (.createReadStream fs path)]
(.on stream "close" #(async/close! out))
(.on stream "data" #(async/put! out %))
out))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
515 次 |
| 最近记录: |