Нет доступа к элементу массива. использовать результат одного запроса ajax для другого запроса ajax

    //global variables
var corpArray = new Array(); //store corp classes instances
var corpId = new Array(); //store corp id's

window.onload = init();

function init() {
  getNpcCorpId();
  console.log(corpId);
  getCorpNames(corpId[5]);
}

//get all corporation id's from the game
function getNpcCorpId() {
  let conName = new XMLHttpRequest();
  conName.onload = function() {
    if (this.status == 200) {
      let idList = JSON.parse(this.responseText);
      idList.forEach(element => {
        corpId.push(element);
      });
    }
  };
  conName.open(
    "get",
    "https://esi.evetech.net/latest/corporations/npccorps/?datasource=tranquility",
    true
  );
  conName.send();
}

//get corporation name
function getCorpNames(element) {
  console.log(element);
  let corpConn = new XMLHttpRequest();
  corpConn.onload = () => {
    if (this.status == 200) {
      console.log(this.responseText);
    }
  };
  corpConn.open(
    "get",
    `https://esi.evetech.net/latest/corporations/${element}/?datasource=tranquility`,
    true
  );
  corpConn.send();
}

Я пытаюсь создать онлайн-api eve, я хочу использовать 2 глобальные переменные для хранения моих извлеченных значений (потому что я не знаю другого способа), я буду использовать пару функций для использования предоставленного eve api. Я не могу получить доступ к своим corpId отдельные элементы, когда я консоль регистрирую весь свой массив, все в порядке, но когда я хочу получить доступ к отдельному элементу, он отображается undefiend.

1 ответ

 //global variables
var corpArray = new Array(); //store corp classes instances
var corpId = new Array(); //store corp id's

window.onload = init();

async function  init() {
  await getNpcCorpId();
  console.log(corpId);
  getCorpNames(corpId[5]);            // asynchronous behaviour - let it be fix using await and async
}

//get all corporation id's from the game
function getNpcCorpId() {
 return new Promise(function(resolve, reject) {
  let conName = new XMLHttpRequest();
  conName.onload = function() {
   if (this.status == 200) {
     let idList = JSON.parse(this.responseText);
     idList.forEach(element => {
    corpId.push(element);
     });
   }
   resolve();
  };
  conName.open(
    "get",
    "https://esi.evetech.net/latest/corporations/npccorps/?datasource=tranquility",
    true
  );
  conName.send();
 
});

  
}

//get corporation name
function getCorpNames(element) {
  console.log(element);
  let corpConn = new XMLHttpRequest();
  corpConn.onload = () => {
    if (this.status == 200) {
      console.log(this.responseText);
    }
  };
  corpConn.open(
    "get",
    `https://esi.evetech.net/latest/corporations/${element}/?datasource=tranquility`,
    true
  );
  corpConn.send();
}

Проще говоря, это связано с асинхронным поведением - когда вы вызываете getNpcCorpId(), это HTTP-запрос, выполнение которого занимает некоторое время, но следующая строка запускается немедленно, поэтому в этот момент corpId все еще пуст. Итак, чтобы исправить эту проблему, вы можете использовать await, который заставит JavaScript ждать, пока обещание не вернет результат.

Надеюсь, это вам поможет!

Другие вопросы по тегам