我有一个函数getHighScores
,我想进入一个JSON文件并获取给定game
的得分对象,对它们进行排序,并返回它们的顶部amount
。 / p>
这是我的(破损)代码:
function getHighScores(game, amount) {
var highScores = null;
fs.readFile('scores.json', 'utf8', function (error, data) {
var scoresObj = JSON.parse(data);
var gameScores = scoresObj.games[game];
sortedScores = gameScores.sort(compareScoreObjects);
highScores = sortedScores.slice(0, amount);
});
return highScores;
}
console.log(getHighScores('snake', 10));
这是记录null
,因为在highScores
的回调函数范围内无法访问fs.readFile
。
有没有办法在保持代码逻辑的同时做到这一点 - 我只能让getHighScores
返回数据?如果没有,我该怎么想这个问题?
答案 0 :(得分:4)
这里的问题是您使用的是readFile,这是一种异步方法。这个方法结算时的含义是,已经返回了highScores。
签出readFileSync方法(https://nodejs.org/api/fs.html#fs_fs_readfilesync_path_options),这是readFile的同步版本。
然后您可以按如下方式更改代码。
function getHighScores(game, amount) {
var scoresObj = fs.readFileSync('scores.json', 'utf8');
var parsedScoresObj = JSON.parse(data);
var gameScores = parsedScoresObj.games[game];
var sortedScores = gameScores.sort(compareScoreObjects);
var highScores = sortedScores.slice(0, amount);
return highScores;
}
答案 1 :(得分:2)
根据我的阅读,fs.readfile是异步的。所以highScores立即返回,而不是等待读取文件。您可以将代码更改为同步。
function getHighScores(game, amount) {
var highScores = null;
var data = fs.readFileSync('scores.json', 'utf8')
var scoresObj = JSON.parse(data);
var gameScores = scoresObj.games[game];
sortedScores = gameScores.sort(compareScoreObjects);
highScores = sortedScores.slice(0, amount);
return highScores;
}
console.log(getHighScores('snake', 10));
如果你想让它保持异步,那么你应该检查这个链接