我是Node.js的新手。在等待之前我明白了#34;即在fileRead方法返回值" data"之前应该是未定义的,但是在等待一秒后它不应该保持一个值,并且fileRead函数肯定已经返回了一个值。请在下面找到代码..
这是一个在fileReader.js中读取文件的简单代码:
exports.fileRead = function(callback){
var fs = require('fs');
var f;
var b = new Buffer(10000);
fs.open('package.json', 'r', function(err, handle){
f = handle;
console.log("reading");
fs.read(f, b, 0, 10000, null, function(err, bytesRead){
console.log("read complete!");
fs.close(f);
callback();
console.log("returning");
return b.toString('utf8',0,bytesRead);
});
});
}
这是一个"导入" fileReader" module" (让我知道我的术语是否错误):
var filePrinter = require('./fileReader.js');
var data;
data = filePrinter.fileRead(function(){
console.log("before waiting -\n"+ data);
});
setTimeout(function(){
console.log("after waiting -\n" + data);
},1000);
控制台在运行时吐出这个:
阅读
阅读完成!
在等待之前 -
未定义
返回
等待后 -
未定义
我知道下面的代码使用回调传递一个参数会工作得很好,但上面代码中的问题是什么?
//fileReader.js
exports.fileRead = function(callback){
var fs = require('fs');
var f;
var b = new Buffer(10000);
fs.open('package.json', 'r', function(err, handle){
f = handle;
console.log("reading");
fs.read(f, b, 0, 10000, null, function(err, bytesRead){
console.log("read complete!");
fs.close(f);
callback(b.toString('utf8',0,bytesRead));
});
});
}
// =============================
var filePrinter = require('./fileReader.js');
var data = null;
data = filePrinter.fileRead(function(b){
data = b;
console.log("before waiting -\n"+ data);
});
setTimeout(function(){
console.log("after waiting -\n" + data);
},1000);
答案 0 :(得分:0)
您的fileRead
函数永远不会返回任何内容,因此调用它的结果为undefined
。您拥有的return b.toString
来自您提供的回调函数 {。}}。
要使其工作,您需要修改read
以将数据传递给自己的回调函数:
fileRead
然后像这样称呼它:
exports.fileRead = function(callback){
var fs = require('fs');
var f;
var b = new Buffer(10000);
fs.open('package.json', 'r', function(err, handle){
f = handle;
console.log("reading");
fs.read(f, b, 0, 10000, null, function(err, bytesRead){
console.log("read complete!");
fs.close(f);
callback(b.toString('utf8',0,bytesRead)); // <==== Here
console.log("returning");
});
});
};
使用 var data; // No need for = null here, but you could add it back if you want
filePrinter.fileRead(function(b){ // <== Data received by callback as `b`
data = b; // <== Now assigned to `data`
console.log("in callback -\n"+ data);
});
的适当位置来自该回调,而不是data
回调,实际上没有理由拥有setTimeout
变量完全 - 只需在回调中使用data
。
答案 1 :(得分:0)
上面代码中的问题是从回调中返回的值从未使用过(并不打算使用) - 看看如何从fs.read
调用回调