首页 > 解决方案 > 无法访问数组元素。将一个 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();
}

我正在尝试创建一个 eve online api,我想使用 2 个全局变量来存储我检索到的值(因为我不知道另一种方式)我将使用几个函数来使用提供的 eve api。我无法访问我的corpId 单个元素,当我控制台记录我的所有数组时,一切都很好,但是当我想访问单个元素时,它似乎不受约束。

标签: javascriptarraysajaxasynchronousapi-eveonline

解决方案


 //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 等到 promise 返回结果。

希望这对你有帮助!


推荐阅读