我是node.js的新手所以请耐心等待。我需要一个返回文件行长度的函数。 我希望做一些像
这样的事情file1 = line_length_func('file');
file2 = line_length_function('file');
if (file1 === file2) { console.log('same number of lines!');}
我一直在研究各种方法,使用child.exec(cat文件| wc -l)但是生成子实例会有点复杂。我不知道如何将变量从我的孩子传递给父母,或者如果这样做是好的做法......
所以我试过这个 - 我看到fs.open的fd返回了行数:
function get_lines(file) {
var lines = fs.open(file, 'r', function(err, fd) {
var lines = fd;
});
}
a = get_lines('file.txt');
console.log(a);
但我一直都没有定义。
我接下来尝试的是:(感谢Andrey Sidorov's post)
function get_line_count(file) {
var count = 0;
fs.createReadStream(file)
.on('data', function(chunk) {
for (var i = 0; i < chunk.length; i++)
if (chunk[i] == 10) count++;
})
.on('end', function() {
return count;
});
}
var file1_lines = get_line_count('test.txt');
console.log(file1_lines);
但我得到了相同的结果。未定义。
我还不习惯节点,所以任何帮助都会很精彩!谢谢!
更新
行计数似乎现在有效,但我仍然无法编写比较两者的函数。
function get_line_count(file, cb) {
var count = 0;
fs.createReadStream(file)
.on('data', function(chunk) {
for (var i = 0; i < chunk.length; i++)
if (chunk[i] == 10) count++;
})
.on('end', function() {
cb(null, count);
})
.once('error', cb);
}
var file1 = get_line_count('test.txt', function(err, lines) {
if (err) return; // todo
return lines;
});
var file2 = get_line_count('test2.txt', function(err, lines) {
if (err) return; //todo
return lines;
});
function same_line_length(len1, len2) {
return len1===len2;
}
console.log(same_line_length(file1, file2));
这总是回归真实...
答案 0 :(得分:2)
在文件读取操作开始之前,您的“get_line_count”已完成。它是异步IO,如果这可以帮助考虑命名你的函数“start_file_linecount_sequence(name,oncomplete)” - 该函数将一些请求放入队列并退出(几乎立即),并在稍后的某个时间点从事件循环调用你的处理程序。
function get_line_count(file, cb) {
var count = 0;
fs.createReadStream(file)
.on('data', function(chunk) {
for (var i = 0; i < chunk.length; i++)
if (chunk[i] == 10) count++;
})
.on('end', function() {
cb(null, count)
})
.once('error', cb);
}
get_line_count('test.txt', console.log);
答案 1 :(得分:1)
在函数get_line_count(file)
中,return count
用于匿名函数('end'事件处理程序),而不是get_line_count()
。所以调用get_line_count()
将返回undefined。
假设您有一个需要知道行数的函数:
function doSomething(count) {
//your code
}
将get_line_count
的定义更改为:
function get_line_count(file, cb) {
var count = 0;
fs.createReadStream(file)
.on('data', function(chunk) {
for (var i = 0; i < chunk.length; i++)
if (chunk[i] == 10) count++;
})
.on('end', function() {
// return count;
cb(count);
});
}
最后,请像这样致电get_line_count()
:
get_line_count(file, doSomething);
答案 2 :(得分:1)
您尝试过的两个函数都使用异步核心方法:fs.createReadStream
和fs.open
。要从这些函数中获得结果,您必须传递一个回调函数,如下所示:
function getLineCount(file, cb) {
var count = 0;
fs.createReadStream(file)
.on('data', function(chunk) {
for (var i = 0; i < chunk.length; i++)
if (chunk[i] == 10) count++;
})
.once('error', cb)
.on('end', function() {
cb(null, count);
});
}
getLineCount('example.txt', function(err, count) {
if (err) return err; // do something about the error
console.log(count);
});
有关闭包和回调的更多信息:What are Closures and Callbacks?