无法将JSON存储在变量中

时间:2017-07-22 18:20:34

标签: json node.js async.js

我无法将JSON存储在变量中。当我调用getIndividualMatchJSONObjHelper函数时,json变量本身会打印出来,但变量之外不会存储任何内容。如何在matchParticipantData.specificParticipantData中正确存储JSON变量?

function getIndividualMatchJSONObj(matchData) {
   var matchParticipantData = {
        specificParticipantData: [numberOfGames]
    };

    for (var i = 0; i < numberOfGames; i++) {
       getIndividualMatchJSONObjHelper(matchData, matchParticipantData, i, function(err, json) {
            matchParticipantData.specificParticipantData[i] = json;
   });
} 
    return matchParticipantData;

}

function getIndividualMatchJSONObjHelper(matchData, matchParticipantData, indexIter, callback) {
    var individualMatchURL = 'https://na1.api.riotgames.com/lol/match/v3/matches/' + matchData.matchID[indexIter] + '?api_key=' + API_KEY;
    var jsonFinal;
     async.waterfall([
        function (callback) {
            request(individualMatchURL, function (err, response, body) {
                if (err)
                    return callback(err);
                if (response.statusCode != 200)
                    return callback(new Error('Status code was ' + response.statusCode));
                var json = JSON.parse(body);
                for (var j = 0; j < 10; j++) {
                    if (matchData.championID[indexIter] == json['participants'][j].championId) {
                        return callback(null, json['participants'][j]);
                }
            }
        });
    }
], callback); 

}

1 个答案:

答案 0 :(得分:0)

在你的getIndividualMatchJSONObj

for (var i = 0; i < numberOfGames; i++) {
       getIndividualMatchJSONObjHelper(matchData, matchParticipantData, i, function(err, json) {
            matchParticipantData.specificParticipantData[i] = json;
       });
} 
return matchParticipantData;

json到你的对象的设置是异步发生的,所以在返回matchParticipantData之后你的json被接收并设置。

你需要以某种方式停止返回,直到json函数完成或转换函数以使用回调来处理/使用数据而不是返回数据。

正常:

function test() {
    return "test";
}

用法:

var data = test();
console.log(data);

回调:

function test(callback) {
    callback("test");
}

用法:

test(function(data) {
    console.log(data);
});