我对节点有点新意,到目前为止我很喜欢它,但也许我在需要扳手的时候遇到了一个锤子的情况。
我在文本文件中收集了大量数据,我需要将这些文件加载到数据库中 - 在普通的命令式语言中非常简单。我想为此编写惯用节点,因此宁愿使用异步fs调用(fs.readdir
和fs.readFile
而不是fs.readdirSync
和fs.readFileSync
)。但是,我怎么知道所有这些操作何时完成,那么(并且只有那时)关闭数据库连接是否安全?
简而言之(伪代码):
MongoClient.connect(url, function(err, db) {
if (err) throw err;
fs.readDir(path, function(err, files) {
for file in files {
if (interesting(file)) {
fs.readFile(file, function(err, data) {
doc = turnDataIntoDocument(data);
db.collection('foo').insert(doc);
});
}
}
});
// This is the part that won't work right:
db.close()
});
显然,db.close()
可能在任何时候发生,可能在处理所有文件之前,或者通常在目录完全读取之前发生。
我知道有用于处理控制流程的库,但我觉得我应该理解如何在更基础的层面上做到这一点,而不是依赖于库来实现这么简单的事情 - 不要关闭连接直到我完成了它。
答案 0 :(得分:0)
在这种情况下,一个简单的计数器应该起作用:
function doInserts(cb) {
MongoClient.connect(url, function(err, db) {
if (err) throw err;
fs.readDir(path, function(err, files) {
var count = files.length;
if (count === 0) {
db.close();
return cb();
}
for (var i = 0; i < files.length; ++i) {
var file = files[i];
if (interesting(file)) {
fs.readFile(file, function(err, data) {
doc = turnDataIntoDocument(data);
db.collection('foo').insert(doc);
if (--count === 0) {
db.close();
cb();
}
});
} else if (--count === 0) {
db.close();
cb();
}
}
});
});
}