2012-05-21 51 views
0

我一直在阅读示例应用程序尝试学习节点。我注意到有几个在boot()中加载模型和控制器时使用readdirSync方法。节点app.js - 同步读取文件?

例如:

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) 
}) 

这似乎反节点给我。这与节点所喜欢的“尝试制造一切异步”是相反的。

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

+1

有没有这样的事情,“试图使一切-async“,你总是使用目前对你来说很方便的工具。 – freakish

回答

3

更可能的是,使初始化更简单 - 当速度的异步性不重要;我们并没有试图处理很多并发请求。同样,如果您需要访问某些在启动时初始化的变量,这些变量将用于应用程序的生命周期,那么您不需要在回调中包装整个应用程序!

0

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

同步读取可能是合意在其他时间保持编码更简单,如Len建议。但是,如你所建议的那样,你的表现简单易行。事实上,在这种情况下最好使用众多的测序辅助程序库之一。通过照顾嵌套的回调和序列问题,这些大大简化了代码。

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

这里有图书馆3:

  • Streamline.js允许你写异步JS/CoffeeScript的,就好像是同步。只需用'_'替换回调。但是你要么编译你的脚本,要么通过加载器运行它们。
  • async - 似乎是关于最好的想法和记录,并建议由几个建立了真实世界的应用程序的人。
  • async.js - 可链接的,暴露FS以及(包括READDIR,walkfiles,水珠,ABSPATH,复制,RM - 专注于FS而不是一般的

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