node.js使代码等待,直到fs.readFile完成

我在node.js文件系统中遇到了问题。 这是我的代码。 我的函数总是返回一个空string。 我想知道有没有办法让我的函数停止执行,直到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函数的返回值,所以这就是为什么我没有使用callback函数

您需要将callback函数传递给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的asynchronous特性。

你的代码的问题是, return str超出了readFilecallback,这意味着return strreadFilecallback被调用来将str设置为一个有意义的值。

如果需要同步执行,则应该使用fs.readFileSync()( https://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_options )。

 var fs = require('fs'); function myfun(filePath){ return fs.readFileSync(filePath); }