如何从回调函数获取值到外部范围?

时间:2018-05-09 17:29:33

标签: javascript json node.js callback

我有一个函数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返回数据?如果没有,我该怎么想这个问题?

2 个答案:

答案 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));

如果你想让它保持异步,那么你应该检查这个链接

How do I return the response from an asynchronous call?