Состояние гонки в Node.js - PullRequest
0 голосов
/ 10 июля 2020

Я изучаю Node.js и делаю практику по API. Я хотел бы получить от Twitch данные о 200 самых популярных стримах игры. Однако из-за лимита 100, поэтому мне нужно дважды запросить в for-l oop. Вопрос в состоянии гонки . Когда я запрашиваю данные из 0-100 и 100-200, я не знаю, какие данные появятся раньше. Итак, я помечаю статус записи, которая идет первой, но, похоже, она работает неправильно. Может ли кто-нибудь объяснить мне, что не так с моим методом? Как это улучшить? Спасибо!

const request = require('request');
const process = require('process');

const args = process.argv[2];
let offset = 0;
let flag = false;
const clientID = 'agdn5682y521syqhwkdrqmw7ho6v7d';

function getGameInfo(gamename, pagination, clientid, tag) {
  request(
    {
      method: 'GET',
      url: `https://api.twitch.tv/kraken/streams/?game=${gamename}&limit=100&offset=${pagination}`,
      headers: {
        'Client-ID': clientid,
        'Accept': 'application / vnd.twitchtv.v5 + json'
      }
    },
    (err, res, body) => {
      if (!tag) {
        tag = true;
        if (err) {
          return console.log('Error', err)
        };
        const data = JSON.parse(body);

        const result = data.streams;

        if (data.status === 404) {
          console.log('fail to get data!');
        };
        for (let j = 0; j < result.length; j++) {
          console.log(result[j].channel._id, result[j].channel.display_name);
        };
        tag = false;
      }
    }
  )
}

for (let i = 0; i < 2; i++) {
  getGameInfo(args, offset, clientID);
  offset += 100;
}

1 Ответ

0 голосов
/ 10 июля 2020

Вот небольшой пример, который вы можете сделать. Promise ждет, пока не получит resolve()

Затем вы можете вызвать следующее смещение.

const request = require('request');
const process = require('process');

const args = process.argv[2];
let offset = 0;
let flag = false;
const clientID = 'agdn5682y521syqhwkdrqmw7ho6v7d';



function getGameInfo(args, offset, clientID){
    return new Promise(function(resolve, reject){
      const options = {
      method: 'GET',
      url: `https://api.twitch.tv/kraken/streams/?game=${args}&limit=100&offset=${offset}`,
      headers: {
        'Client-ID': clientID,
        'Accept': 'application / vnd.twitchtv.v5 + json'
      }
    }
        request(options, function (err, response, body) {
            if (err) return reject(err);
            try {
                resolve(JSON.parse(body));
            } catch(e) {
                reject(e);
            }
        });
    });
}

getGameInfo("pubg", offset, clientID).then(function(val) {
    console.log(val);
}).catch(function(err) {
    console.log(err);
});

...