调用函数始终返回未定义,但console.log正确

时间:2020-07-25 07:03:45

标签: javascript node.js

我有2个文件,包含名称。我想从两个文件中生成名称的随机组合。 但是,当我调用函数时,它会正确命名console.log(),但会将未定义存储在couple变量中。

我当前的代码如下:

function getRandomLine(filename) {
  fs.readFile(filename, function (err, data) {
    if (err) throw err;
    data += "";
    var lines = data.split("\n");
    line = lines[Math.floor(Math.random() * lines.length)];
    console.log(line);
    return line;
  });
}

function generateRandomCouple(f1, f2) {
  male = getRandomLine(f1);
  female = getRandomLine(f2);
  return male + " & " + female;
}

couple = generateRandomCouple("./maleNames.txt", "./femaleNames.txt");
console.log(couple);

我得到的输出是:

undefined & undefined
Sam
Penny

此外,对于何时使用某些东西我还是很困惑。then()。catch()vs异步/等待vs这种回调风格的代码。 有什么好方法可以考虑何时使用什么?

编辑: 如果使用readFileSync,则会在控制台上看到以下内容: undefined & undefined

2 个答案:

答案 0 :(得分:1)

您期望callback函数在调用函数synchronously时执行。

更新您的代码,如下所示

async function getRandomLine(filename) {
  return new Promise(function (resolve, reject) {
    fs.readFile(filename, function (err, data) {
      if (err) reject(err); // Reject in case of error
      data += "";
      var lines = data.split("\n");
      line = lines[Math.floor(Math.random() * lines.length)];
      console.log(line);
      resolve(line); // Resolve if success
    });
  });
}

async function generateRandomCouple(f1, f2) {
  male = await getRandomLine(f1);
  female = await getRandomLine(f2);
  return male + " & " + female;
}

(async function() {
  couple = await generateRandomCouple("./maleNames.txt", "./femaleNames.txt");
  console.log(couple);
})();

答案 1 :(得分:0)

fs.readFile异步运行。 getRandomLine立即返回未定义。为了使其按预期工作,您可能希望使用async-await。像这样:

async function getRandomLine(filename) {
 var x=  await fs.readFile(filename, 'binary');
  ....
 return new Buffer(x)
}