【问题标题】:Node app.js - Reading files synchronously?Node app.js - 同步读取文件?
【发布时间】:2012-05-22 19:23:50
【问题描述】:

我一直在阅读示例应用程序尝试学习节点。而且我注意到有几个在 boot() 上加载模型和控制器时使用 readdirSync 方法。

例如:

    var models_path = __dirname + '/app/models'
var model_files = fs.readdirSync(models_path)
model_files.forEach(function(file){
  if (file == 'user.js')
    User = require(models_path+'/'+file)
  else
    require(models_path+'/'+file)
})

这对我来说似乎是反节点。这与节点所支持的“try-to-make-everything-async”相反。

这样的同步文件读取何时以及为何会是一个好主意?

【问题讨论】:

  • 没有“try-to-make-everything-async”这样的东西。您总是使用目前方便的工具。

标签: javascript node.js asynchronous


【解决方案1】:

很可能是为了让初始化更简单——当为了速度而异步并不重要时;我们不会尝试为许多并发请求提供服务。

同样,如果您需要访问某个在启动时初始化的变量,这些变量将在应用程序的整个生命周期中使用,您不希望将整个应用程序包装在回调中!

【讨论】:

    【解决方案2】:

    同步读取是需要,当您必须在继续之前确定所有数据都可用并且您需要保持序列有序时。换句话说,如果您需要阻止进程并且无法(对任何人)执行任何其他操作,例如在启动服务器时(例如读取 HTTPS 的证书文件)。

    同步读取可能在其他时间可取,以使编码更简单,正如 Len 所建议的那样。但是,您正在按照您的建议在简单性和性能之间进行权衡。事实上,在这种情况下,最好使用许多测序辅助库之一。这些通过处理嵌套回调和序列问题大大简化了您的代码。

    当然,您作为示例提供的代码是相当危险的——如果读取失败会发生什么?

    这里有 3 个库:

    • Streamline.js 允许您编写异步 js/coffeescript,就好像它是同步的一样。只需将回调替换为“_”即可。但是您要么必须编译脚本,要么通过加载程序运行它们。
    • async - 似乎是经过深思熟虑和记录在案的最佳方法,并得到了一些构建实际应用程序的人的推荐。
    • async.js - 可链接,也公开 fs(包括 readdir、walkfiles、glob、abspath、copy、rm - 专注于 fs 而不是泛型

    此链接也可能有用:The Tale of Harry - 解释一个神话般的程序员如何从传统编程转向基于回调的编程以及他最终使用的模式。还有助于深入了解异步库中呈现的模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多