【问题标题】:node.js make code wait until the fs.readFile is completed [duplicate]node.js让代码等到fs.readFile完成[重复]
【发布时间】:2015-10-24 02:35:06
【问题描述】:

我在 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函数中的返回值,所以这就是我没有使用回调函数的原因

【问题讨论】:

  • @GopinathShiva 将 return str; 放入回调中不会有任何好处。 OP 你正在寻找fs.readFileSync()
  • 如果你真的需要和.replace()一起使用,你应该使用fs.readFileSync()
  • 感谢 robertklep,我想知道我在替换函数中使用 fs 是否是个好方法

标签: javascript node.js fs


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您需要将回调传递给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 strreadFile 回调之外,这意味着 return str 在调用 readFile 回调以将 str 设置为有意义的值之前执行。

    【讨论】:

    • 这是使用 nodejs 的方式——尽管我可能会添加 utf8 编码参数,因为看起来 OP 期望返回一个字符串。
    猜你喜欢
    • 2021-12-23
    • 2018-06-15
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 2011-09-23
    • 2018-07-21
    • 2011-10-01
    相关资源
    最近更新 更多