这实际上是关于异步的问题我不能让它工作,因为没有设置summonerData数组,我知道它可能是关于异步但我不知道如何验证它。
var summonerName = req.params.playerName;
var summonerData = [];
var summonerIds = [];
var summonerGames = [];
redis.exists(summonerName, function(err, reply) {
if (reply === 1) {
console.log('Data Found for Summoner in Redis!: ' + summonerName);
redis.hgetall(summonerName, function(err, object) {
summonerData.push(object);
});
} else {
console.log('Data not Found for Summoner: ' + summonerName);
lolapi.Summoner.getByName(summonerName, function(error, summoner) {
if (summoner) {
console.log('Summoner was retrieved by API! and Saved to Redis!');
redis.hmset(summonerName, summoner[summonerName]);
summonerData.push(summoner[summonerName]);
}
});
}
});
console.log(summonerData);
答案 0 :(得分:0)
当您异步执行某些操作时,意味着将来某个时候会调用该函数。您对redis.exists
的调用意味着将来的某个时刻,您将调用您提供的功能。后面的行console.log(summonerData)
在回调函数之前运行。
将console.log(summonerData)
移动到函数中,使其按预期工作。
答案 1 :(得分:0)
您应该使用promises
var getSummonerData = function (summonerName) {
return new Promise(function (resolve, reject) {
var summonerData = [];
var summonerIds = [];
var summonerGames = [];
redis.exists(summonerName, function (err, reply) {
if (err) {
return reject(err);
}
if (reply === 1) {
console.log('Data Found for Summoner in Redis!: ' + summonerName);
redis.hgetall(summonerName, function (err, object) {
if (err) {
return reject(err);
}
summonerData.push(object);
resolve(summonerData);
});
} else {
console.log('Data not Found for Summoner: ' + summonerName);
lolapi.Summoner.getByName(summonerName, function (error, summoner) {
if (error) {
return reject(error);
}
if (summoner) {
console.log('Summoner was retrieved by API! and Saved to Redis!');
redis.hmset(summonerName, summoner[summonerName]);
summonerData.push(summoner[summonerName]);
}
resolve(summonerData);
});
}
});
});
};
getSummonerData(req.params.playerName)
.then(function (summonerData) {
res.render(..., summonerData);
});