Как получить значение из функции обратного вызова во внешнюю область? - PullRequest
0 голосов
/ 09 мая 2018

У меня есть функция getHighScores, которую я хочу зайти в файл JSON и получить объекты оценки для заданного game, отсортировать их и вернуть верхние amount из них.

Thisмой (неработающий) код:

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 голосов
/ 09 мая 2018

Проблема здесь в том, что вы используете readFile, который является асинхронным методом. Имеется в виду, что к моменту разрешения этого метода высокие показатели уже возвращаются.

Извлечь метод 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;
}
0 голосов
/ 09 мая 2018

Из того, что я прочитал, 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));

Если вы хотите сохранить асинхронность, тогда вам нужно проверить эту ссылку

Как вернуть ответ от асинхронного вызова?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...