gpt4 book ai didi

node.js - ClojureScript (nodejs) 返回文件字符串内容的函数

转载 作者:太空宇宙 更新时间:2023-11-04 00:46:25 26 4
gpt4 key购买 nike

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

(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: (intermediate value)(intermediate value)(intermediate value)(...).call is not a function at repl:99:6 at tryToString (fs.js:414:3) at 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

最佳答案

  1. 不,在源代码的根范围之外的任何地方使用 def 通常是一个坏主意,而且不符合习惯。如果你想创建另一个局部变量,那么另一个 let表达才是出路。

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

有几个选项:

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

  • 而不是尝试提取 go 中的数据 block ,您应该返回 chan您正在输入>!并让下一个函数从自己的 go block 中的 channel 获取数据 <! 。使用 core.async 时,这比回调更惯用。

关于node.js - ClojureScript (nodejs) 返回文件字符串内容的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34557266/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com