0

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

这对我来说似乎是反节点。这与节点喜欢的“尝试使一切异步”相反。

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

4

2 回答 2

3

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

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

于 2012-05-21T10:24:39.733 回答
0

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

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

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

以下是其中的 3 个库:

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

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

于 2012-05-22T11:23:50.217 回答