【问题标题】:ClojureScript (nodejs) function that returns the string content of a fileClojureScript (nodejs) 函数,返回文件的字符串内容
【发布时间】:2016-01-01 15:07:21
【问题描述】:

我正在尝试创建一个函数,该函数采用文件路径并将其内容作为字符串返回。这是我的代码 sn-p:

(defn get-string-from-file-path [path]
  (let [fs (node/require "fs") c (chan)]
      (.readFile fs path "utf8" (fn [err data] ((go (>! c (str data))))))
      (go (def r (str (<! c)))) ; is using def correct here?
       r))
  1. 在第 4 行使用 def 是否正确/惯用?
  2. 使用有效的文件路径调用此函数后,我收到以下错误:

TypeError:(中间值)(中间值)(中间值) value)(...).call 不是函数 在回复:99:6 在 tryToString (fs.js:414:3) 在 FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:401:12)

奇怪的是,如果我再次调用函数,我会得到文件所需的字符串内容!这是怎么回事?

编辑:这是更正后的函数:

(defn get-string-channel-from-file-path [path] ; function is now "get string channel" instead of "get string"
  (let [fs (node/require "fs") c (chan)]
      (.readFile fs path "utf8" (fn [err data] (go (>! c data))))
        c)) ; return channel instead of string

【问题讨论】:

    标签: node.js clojure clojurescript


    【解决方案1】:
    1. 不,在源代码的根范围以外的任何地方使用 def 通常是一个坏主意,而且不习惯。如果您想创建另一个局部变量,那么另一个 let 表达式是可行的方法。

    2. 为什么它有时会起作用,您正在使用异步函数并尝试使其同步。这导致了竞争条件。有时文件系统会在您从函数返回之前返回文件(这就是有效的原因),有时不是(错误)。

    有几个选项:

    • 您可以尝试使用节点的readFileSync 函数使函数同步。这样你就可以返回它返回的内容。

    • 与其尝试提​​取 go 块中的数据,不如将您放入的 chan 返回到 &gt;! 并让下一个函数在其自己的 go 块中从通道中获取数据&lt;!。这比使用 core.async 时的回调更惯用。

    【讨论】:

    • readFileSync 是最简单的解决方案。但是,出于学习目的,我更正了上面继续使用异步readFile 的函数。现在该函数返回一个通道而不是一个字符串。你觉得它是否正确和惯用?
    • 看起来好多了是的!有几件小事:你不需要 go 表达式周围的额外括号。数据的内容也是一个字符串,所以调用(str data)我不相信在做任何事情。
    • 酷。我更正了上面的功能。而且:我觉得我的函数命名不是惯用的,因为它使用“get”这个词并指代“chan”和“string”类型(因此这个名字对于像 Java 这样的语言比对于像这样的语言更惯用Clojure 脚本)。我的直觉正确吗?如果是这样,这种函数的适当惯用名称是什么?
    • Clojure 函数往往更简洁,通常描述函数的核心。我会说read-file-chan 将是一个可接受的函数名称。这包括函数的核心和返回类型。我并不总是将返回类型添加到函数名称中,但我通常会为 core.async 通道设置一个例外,因为它真正重要的是你知道你得到了一个 chan 回来。尽管如此,这也是个人或基于团队的偏好。这是一个很好的风格问题资源:github.com/bbatsov/clojure-style-guide
    猜你喜欢
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2016-08-27
    • 2010-12-24
    • 1970-01-01
    • 2019-10-12
    • 2021-09-27
    相关资源
    最近更新 更多