1

我是 nodejs 的新手,我正在尝试 append 函数。当我运行下面的代码时,在提示他之后只接受用户输入,关于最喜欢的歌手并放入一个带有歌手姓名的文件。并附加最喜欢的歌曲,似乎如果用户输入退出它应该将它附加到文件但是,它不是???同时,如果添加了对 appendFileSync(fn 的同步版本)出口的更改?

代码:

var readline = require ('readline');
var fs = require('fs');
var rl = readline.createInterface(process.stdin, process.stdout);
var singer = {
  name:'',
  songs: []
};

rl.question("What is your fav singer? ", function(answer) {
  singer.name = answer;

  //creating a file for this singer
  fs.writeFileSync(singer.name+".md", `${singer.name}\n====================\n\n`); 

  rl.setPrompt(`What's your fav songs for ${singer.name} ?`);
  rl.prompt();

  rl.on('line', function(song) {
    singer.songs.push(song.trim());
    fs.appendFile(singer.name+".md", `* ${song.trim()} \n`);
    //***** WHY IF ITS EXIT ITS NEVER APPEND IT TO THE FILE
    console.log(`* ${song.trim()} \n`);

    if (song.toLowerCase().trim() === 'exit') {
      fs.appendFile(singer.name+".md", "Bye"); 
      //***** WHY ITS NEVER APPEND IT TO THE FILE
      rl.close();       
    } else {
      rl.setPrompt(`what else would ${singer.name} say? ('exit'to leave)`);
      rl.prompt();
    }
  });
});

rl.on ('close', function() {
  console.log ("%s is a real person that says %j", singer.name, singer.songs);
  process.exit();
});
4

1 回答 1

1

因为fs.appendFile是异步的。当您调用它时,io 操作仅排队。不幸的是,您的脚本在真正的 io 操作发生之前就退出了。

所以。您必须使用fs.appendFileSyncfs.appendFile与回调(第三个参数)一起使用,并且在调用回调时,执行所有进一步的活动。

于 2016-01-26T18:18:22.540 回答