我在node.js文件系统中遇到了问题。 这是我的代码。 我的函数总是返回一个空字符串。 我想知道是否有任何方法让我的函数停止执行,直到readFile方法完成。
var fs = require('fs');
function myfun(filePath){
var str = '';
fs.readFile(filePath, function(err, data){
if(err) throw err;
str = data;
});
return str; //here, the variable str always return '' because the function doesn't wait for the readFile method complete.
}
添加说明
其实我做的是这样的: 函数myfun用于替换str 你可以看到我的代码:
function fillContent(content) {
var rex = /\<include.*?filename\s*=\s*"(.+?)"\/>/g;
var replaced = fileStr.replace(rex, function (match, p1) {
var filePath = p1
var fileContent = '';
fs.readFile(filePath, function (err, data) {
if (err) {
throw err;
}
fileContent = data;
});
return fileContent;
});
return replaced;// here, the return value is used for replacement
}
我需要在replace函数中返回一个值,所以这就是我没有使用回调函数的原因
答案 0 :(得分:6)
您需要将回调传递给myfun
函数,如下所示,以便在文件读取结束时从函数中获取数据:
var fs = require('fs');
function myfun(filePath, cb){
var str = '';
fs.readFile(filePath, 'utf8', function(err, data){
if(err) throw err;
cb(data);
});
}
// call it like this
myfun('some_path', function(data) { /* use returned data here */} );
您需要投入一些时间来更好地理解JavaScript的异步性质。
您的代码存在的问题是return str
超出了readFile
回调,这意味着return str
的执行时间早于调用readFile
回调以设置str
有意义的价值。
答案 1 :(得分:5)
如果你需要同步,那么你应该使用fs.readFileSync()(https://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_options)代替。
var fs = require('fs');
function myfun(filePath){
return fs.readFileSync(filePath);
}