调用函数总是返回未定义的,但 console.log 是正确的

我有 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

另外,我仍然很困惑什么时候使用 something.then().catch() vs async/await vs 这种回调风格的代码。有什么好的方法来考虑什么时候使用什么?


编辑:如果我使用readFileSync,我会在控制台上得到以下信息: undefined & undefined


HUH函数
浏览 136回答 2
2回答

慕容森

您期望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);})();

PIPIONE

 fs.readFile异步运行。getRandomLine立即返回未定义。要使其按预期工作,您可能希望使用async-await. 是这样的:async function getRandomLine(filename) { var x=  await fs.readFile(filename, 'binary');  .... return new Buffer(x)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript