Как лучше всего отправить несколько запросов на сервер? - PullRequest
0 голосов
/ 25 апреля 2020

Во-первых, я пишу в node.js, используя разногласия модулей. js, запрос и запрос-обещание. У меня проблемы с отправкой тонны (около 70) различных запросов на сервер. Я продолжаю получать один и тот же результат от разных запросов. 'https://api.mojang.com/user/profiles/' + entry.uuid + '/names' Это запрос, который я делаю, у меня есть forEach l oop, который просматривает список URL, как этот. Вот мой код для запросов:

function getNames() {
    count = 0;
    msg.channel.send("Started getting Names");
    urls.forEach(function() {
        request(urls[count], function(err, res, body) {
            if (!err && res.statusCode == 200) {
                const obj = JSON.parse(body);
                names[count] = body[0].name;
                msg.channel.send(urls[count] + ", Username " + count + ": " + obj[0].name);
            } else {
                msg.channel.send("Username Error: " + err);
            }
        });
        count++;
    });
    while (true) {
        if (names.length != urls.length) {
            msg.channel.send("Finished getting Names");
            console.log("UUIDs:" + urls.join(", "));
            console.log("Names:" + names.join(", "));
            break;
        }
    }
}

Команды msg.channel.send, которые я использую для отладки своего кода (несогласие. js, если вам интересно). Теперь моя проблема заключается в следующем: msg.channel.send(urls[count] + ", Username " + count + ": " + obj[0].name); всегда дает мне новый URL, но с тем же именем пользователя, что и в первом запросе (obj[0].name всегда одинаково). Итак, скажем, у меня есть 3 разные URL-адреса, первый URL-адрес пользователя - Эван, второй - Джек, третий - Джон. Когда я запускаю код, мой массив имен будет ["Evan", "Evan", "Evan"] вместо ["Evan", "Jack", "John"]. Я думаю, это потому, что мой код не ждет результата запроса, прежде чем двигаться дальше. Я уверен, что, вероятно, есть много лучших способов сделать это, я был бы признателен за любые советы.

1 Ответ

1 голос
/ 25 апреля 2020

Демо: https://repl.it/@kallefrombosnia / OldfashionedQuintessentialConditions

// request package is deprecated so I use this one
const fetch = require('node-fetch');

// random mojang acc's
const urls = [
  'https://api.mojang.com/user/profiles/7125ba8b1c864508b92bb5c042ccfe2b/names',
  'https://api.mojang.com/user/profiles/97f2453a361b44fa9312c496b67f24fc/names',
  'https://api.mojang.com/user/profiles/ac224782efff4296b08cdbde8e47abdb/names',
];


getNames = () => {

  let names = [];
  let round = 0;

  // parse trough urls
  urls.forEach((url, index) => {

    // fetch url info
    fetch(url).then(res =>

      // json convert
      res.json())

      .then(jsonBody => {

        // iteration level
        round++;

        // add name to the array
        names.push(jsonBody[0].name);

        // print some info about user
        console.log(urls[index] + ", Username " + index + ": " + jsonBody[0].name);

        // if this is last round and number of names is same as urls number print all info about users
        if (round === urls.length && names.length === urls.length) {

          console.log("Finished getting Names");
          console.log("UUIDs:" + urls.join(", "));
          console.log("Names:" + names.join(", "));
        }

      })
  })
}

getNames();
...