节点app.js - 同步读取文件?

时间:2012-05-21 10:18:22

标签: javascript node.js asynchronous

我一直在阅读示例应用程序尝试学习节点。我注意到有几个人在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”相反。

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

2 个答案:

答案 0 :(得分:3)

更有可能的是,使初始化更简单 - 当速度的异步性无关紧要时;我们不会尝试为许多并发请求提供服务。

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

答案 1 :(得分:0)

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

在其他时间,同步读取可能是理想的,以保持编码更简单,如Len建议的那样。但是,正如你的建议,你正在以简洁的方式处理性能问题。事实上,在这种情况下,最好使用众多测序助手库中的一个。这些通过处理嵌套回调和序列问题大大简化了代码。

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

以下是3个库:

  • Streamline.js允许您编写async js / coffeescript,就好像它是同步一样。只需用'_'替换回调即可。但是你必须编译脚本或通过加载器运行它们。
  • async - 似乎是关于最佳思考和记录的,并且是由几个已经构建了真实应用程序的人推荐的。
  • async.js - 可连接,也暴露了fs(包括readdir,walkfiles,glob,abspath,copy,rm - 专注于fs而非泛型

此链接也可能有用:The Tale of Harry - 解释神话程序员如何从传统编程转移到基于回调的&他最终使用的模式。也是对异步库中呈现的模式的有用见解。