变量没有设置在函数外?

时间:2017-01-03 07:24:07

标签: javascript

这实际上是关于异步的问题我不能让它工作,因为没有设置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);

2 个答案:

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

更多:https://spring.io/understanding/javascript-promises