为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

HUH函数 2022-12-02 16:09:04
我有 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 & undefinedSamPenny另外,我仍然很困惑什么时候使用 something.then().catch() vs async/await vs 这种回调风格的代码。有什么好的方法来考虑什么时候使用什么?编辑:如果我使用readFileSync,我会在控制台上得到以下信息: undefined & undefined
查看完整描述

2 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

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

})();


查看完整回答
反对 回复 2022-12-02
?
PIPIONE

TA贡献1829条经验 获得超9个赞

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


async function getRandomLine(filename) {

 var x=  await fs.readFile(filename, 'binary');

  ....

 return new Buffer(x)

}


查看完整回答
反对 回复 2022-12-02
  • 2 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号