使用NodeJS

时间:2015-09-12 17:47:03

标签: javascript node.js request

我正在搞乱SteamAPI以学习一些NodeJS。一旦我将游戏ID存储在一个数组中,我就会在获得玩家个人资料的初始请求之后尝试获取游戏信息。关键是我不知道如何在整个ID数组被迭代后“返回”一个数组,并且所有结果都来自服务器。

function getThumbs(game) {
    return rq(
        'http://store.steampowered.com/api/appdetails?appids=' + game,
        {json: true},
        function (error, response, bd) {
            if(response.statusCode === 200 && bd[game].data) {
                return bd[game].data.screenshots;
            }
        });
}

function getGamesThumbnails(games) {
    var deferred = $q.defer(),
        queue = [];

    for (var y = 0; y < games.length; y++) {
        var game = games[y];
        var thumbs = getThumbs(game);

        queue.push(thumbs);
    }

    $q.all(queue).then(
        function (data) {
            deferred.resolve(data);
        },
        function (err) {
            deferred.reject(err)
        }
    );

    return deferred.promise;
}

    app.get('/blog',function(client_req,client_res){

    rq('http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?key=' + key + '&steamid=blablabla&format=json', function (error, response, body) {
        var data = JSON.parse(body);
        var games = data.response.games.map(function (game) {
            return game.appid;
        });

        getGamesThumbnails(games).then(function (data) {
            console.log(data)
        })

    });
});

2 个答案:

答案 0 :(得分:0)

您的getThumbs()函数未返回承诺。 $ q.all仅适用于包含promises的数组,而rq使用回调。

试试这个:

function getThumbs(game) {
  var deferred = $q.defer(),
  rq(
      'http://store.steampowered.com/api/appdetails?appids=' + game,
      {json: true},
      function (error, response, bd) {
          if(response.statusCode === 200 && bd[game].data) {
              deferred.resolve(bd[game].data.screenshots);
          }
      });

  return deferred.promise;
}

答案 1 :(得分:0)

基本上,您应该使用回调,因为就像您在getThumbs中所做的那样,您将返回该对象,而您应该返回值bd[game].data.screenshots;

function getThumbs(game, cb) {
    return rq(
        'http://store.steampowered.com/api/appdetails?appids=' + game,
        {json: true},
        function (error, response, bd) {
            if(response.statusCode === 200 && bd[game].data) {
                cb(null, bd[game].data.screenshots);
            }
        });
}

function getGamesThumbnails(games) {
    var deferred = $q.defer(),
        queue = [];

    for (var y = 0; y < games.length; y++) {
        var game = games[y];
        getThumbs(game, function(err, value) {
            queue.push(value);
        });


    }

    $q.all(queue).then(
        function (data) {
            deferred.resolve(data);
        },
        function (err) {
            deferred.reject(err)
        }
    );

    return deferred.promise;
}

并且要将响应返回给客户端,您必须使用client_res.send(VALUE)

所以底部会变成这样:

app.get('/blog',function(client_req,client_res){

    rq('http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?key=' + key + '&steamid=blablabla&format=json', function (error, response, body) {
        var data = JSON.parse(body);
        var games = data.response.games.map(function (game) {
            return game.appid;
        });

        getGamesThumbnails(games).then(function (data) {
            client_res.send(data);
            console.log(data)
        })

    });
});