【问题标题】:How do I get a value from a callback function to the outside scope?如何从回调函数中获取值到外部范围?
【发布时间】:2018-05-09 17:29:32
【问题描述】:

我有一个函数 getHighScores,我想将它放入一个 JSON 文件并获取给定 game 的分数对象,对它们进行排序,然后返回其中的顶部 amount

这是我的(损坏的)代码:

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,因为在fs.readFile 的回调函数范围内无法访问highScores

有什么方法可以在保持代码逻辑的同时做到这一点 - 我可以简单地让 getHighScores 返回数据?如果不是,我应该如何考虑这个问题?

【问题讨论】:

    标签: javascript json node.js callback


    【解决方案1】:

    这里的问题是您使用的是 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;
    }
    

    【讨论】:

      【解决方案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?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-14
        • 2016-03-02
        • 2019-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多