簡體   English   中英

將多個API請求與NodeJS連接

[英]Concatenate several API request with NodeJS

我搞砸了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)
        })

    });
});

您的getThumbs()函數不會返回promise。 $ q.all僅適用於包含promise的數組,而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;
}

基本上,您應該使用回調,因為就像在getThumbs中所做的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)
        })

    });
});

謝謝你倆! 我嘗試了尤里(Yuri)的方法,但是$ q.all似乎都無法解決承諾數組(在getThumbs()的最后一個請求之后什么都沒有發生)

  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) {
        console.log(data)
        deferred.resolve(data);
    },
    function (err) {
        deferred.reject(err)
    }
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM