我有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
答案 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)
}