javascript - 无法访问数组元素。将一个 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 单个元素,当我控制台记录我的所有数组时,一切都很好,但是当我想访问单个元素时,它似乎不受约束。
解决方案
//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 返回结果。
希望这对你有帮助!
推荐阅读
- python - 使用 python 对 BigQuery API 运行大型查询
- laravel - laravel-5.7:数据未保存到数据库中
- c - 如何在 C 中对不同文件的列求和?
- java - 如何获取所选下拉菜单的文本值
- java - 如何使用 maven 和 jenkins 更新子 pom 版本
- linux - 输出一个文本文件,包括用于生成它的命令
- javascript - 如何加载每分钟将url存储在数组中的新网站
- php - 合并数组值中 ID 上的多暗淡数组
- php - 使用 php 对 mysql 运行持续查询而不刷新 HTML 页面
- json - 如何读取 json 对象中所有键的值并将其添加到状态?