我正在尝试学习异步编程,并且正在努力学习nodeschool.io的第4课,并实现了带回调的异步io.
基本上,我正在尝试使用fs.readFile来计算使用回调的文件中的换行符数.
这是我的代码:
var fs = require('fs'); var pathToFile = process.argv[2]; function counter(callback) { var buffer = fs.readFile(pathToFile, function (err, data) { var bufferString = buffer.toString(); var bufferStringSplit = bufferString.split('\n'); }); callback(); } function logMyNumber() { console.log(bufferStringSplit.length-1); } counter(logMyNumber);
我知道一旦代码行完成执行就会执行回调,所以不应该执行
var bufferString = buffer.toString(); var bufferStringSplit = bufferString.split('\n');
在fs.readFile()完成从磁盘读取文件后调用?
最后,callback()调用logMyNumber,它应该只输出文件所具有的行数.
您有几个问题正在进行中,我将尝试尽可能地概述它们
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); }
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(); }); }
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);