您遇到了几个问题,我会尽可能地概述它们
问题一:变量作用域
var fs = require('fs');
var pathToFile = process.argv[2];
function counter(callback) {
var buffer = fs.readFile(pathToFile, function (err, data) {
// Both of the following variables are scoped to the callback of fs.readFile
var bufferString = buffer.toString();
var bufferStringSplit = bufferString.split('\n');
});
callback();
}
function logMyNumber() {
// Because the variables are in a closure above, bufferStringSplit is null here
console.log(bufferStringSplit.length-1);
}
counter(logMyNumber);
解决办法:
声明模块范围内的变量:
var fs = require('fs');
var pathToFile = process.argv[2];
// These can now be accessed from anywhere within the module
var bufferString, bufferStringSplit;
function counter(callback) {
fs.readFile(pathToFile, function (err, data) {
bufferString = data.toString();
bufferStringSplit = bufferString.split('\n');
callback();
});
}
// bufferStringSplit should no longer return null here
function logMyNumber() {
console.log(bufferStringSplit.length-1);
}
问题 2:回调
function counter(callback) {
fs.readFile(pathToFile, function (err, data) {
bufferString = buffer.toString();
bufferStringSplit = bufferString.split('\n');
// Place the callback WITHIN the other callback, otherwise they run in parallel
callback();
});
}
问题 3:fs.readFile API
fs.readFile 不返回任何内容,所以下面的 buffer 变量是 null
function counter(callback) {
var buffer = fs.readFile(pathToFile, function (err, data) {
bufferString = buffer.toString();
bufferStringSplit = bufferString.split('\n');
});
callback();
}
解决办法:
function counter(callback) {
fs.readFile(pathToFile, function (err, data) {
// The data argument of the fs.readFile callback is the data buffer
bufferString = data.toString();
bufferStringSplit = bufferString.split('\n');
});
callback();
}
最后,代码应该是这样的:
var fs = require('fs');
var pathToFile = process.argv[2];
var bufferString, bufferStringSplit;
function counter(callback) {
fs.readFile(pathToFile, function (err, data) {
bufferString = data.toString();
bufferStringSplit = bufferString.split('\n');
callback();
});
}
function logMyNumber() {
console.log(bufferStringSplit.length-1);
}
counter(logMyNumber);