数组按随机顺序打印,当在axios内部时获取方法,但当在外部时正确打印



我一直在与一个问题作斗争,这个问题让我神经紧张。

我写了axiosGET-方法,从1.12开始接收所有Minecraft版本。

router.get("/currentReleases", (req, res) => {

get("https://launchermeta.mojang.com/mc/game/version_manifest.json").then((data) => {
var currentReleases = Array()
data.versions.forEach(version => {
const releaseDate = new Date(version.releaseTime);
const releaseDate_1_12 = new Date("2017-06-02T13:50:27+00:00")
if(releaseDate_1_12 <= releaseDate) {
if(version.type == "release") {
currentReleases.push(version)
}
}
});
res.send(currentReleases);
})
});

这段代码正在按预期工作。

第二个代码段应该过滤当前版本的所有可用的最新纸栓版本,循环通过forEach:

router.get("/availablePaperReleases", (req,res) => {

get("http://localhost:3001/currentReleases").then((data) => {
var currentReleases = Array();
data.forEach((paper) => {
currentReleases.push(paper.id);
})

var currentPaperBuilds = Array();
currentReleases.forEach((version, index, array) => {
// CORRECT ORDER
// console.log(version + " : " + index + " : " + array.length)
get("https://api.papermc.io/v2/projects/paper/versions/"+version+"/builds").then((paperdata) => {
// RANDOMIZED ORDER
console.log(version + " : " + index + " : " + array.length)

}).catch(error => console.log("no data"))
if(index == array.length - 1) {
console.log("Sending data");
res.send(currentPaperBuilds);
}
})

});
});

具有// CORRECT ORDER注释的console.log()工作得完美无瑕。但是一旦console.log()get()-方法中,输出就会变得非常奇怪并且完全随机,每次,我都会重新运行代码。

获取方法:

async function get(url) {
let response = await axios.get(url);
return response.data
}

正确的订单输出:

1.19.2 : 0 : 28
1.19.1 : 1 : 28
1.19 : 2 : 28
1.18.2 : 3 : 28
1.18.1 : 4 : 28
1.18 : 5 : 28
1.17.1 : 6 : 28
1.17 : 7 : 28
1.16.5 : 8 : 28
1.16.4 : 9 : 28
1.16.3 : 10 : 28
1.16.2 : 11 : 28
1.16.1 : 12 : 28
1.16 : 13 : 28
1.15.2 : 14 : 28
1.15.1 : 15 : 28
1.15 : 16 : 28
1.14.4 : 17 : 28
1.14.3 : 18 : 28
1.14.2 : 19 : 28
1.14.1 : 20 : 28
1.14 : 21 : 28
1.13.2 : 22 : 28
1.13.1 : 23 : 28
1.13 : 24 : 28
1.12.2 : 25 : 28
1.12.1 : 26 : 28
1.12 : 27 : 28
Sending data
no data

随机订单输出:

Sending data
1.15 : 16 : 28
1.16.3 : 10 : 28
1.14 : 21 : 28
1.15.1 : 15 : 28
1.17 : 7 : 28
1.19 : 2 : 28
1.18.1 : 4 : 28
no data
1.19.2 : 0 : 28
1.19.1 : 1 : 28
1.17.1 : 6 : 28
1.18 : 5 : 28
1.16.2 : 11 : 28
1.14.1 : 20 : 28
1.14.3 : 18 : 28
1.14.2 : 19 : 28
1.16.1 : 12 : 28
1.12.1 : 26 : 28
1.12 : 27 : 28
1.16.4 : 9 : 28
1.14.4 : 17 : 28
1.18.2 : 3 : 28
1.15.2 : 14 : 28
1.12.2 : 25 : 28
1.13 : 24 : 28
1.13.2 : 22 : 28
1.13.1 : 23 : 28
1.16.5 : 8 : 28

最后应该执行Sending data注释。

如果能给我任何建议来解决这个问题,我将不胜感激。

你可以在这里找到完整的代码。

多亏有人为我做了更大的重写,数组现在可以正常工作了:

const get = async (url) => {
return new Promise(async (resolve, reject) => {
let response = await axios.get(url).catch(reject);
resolve(response?.data);
});
};
const getReleases = async (url) => {
return new Promise(async (resolve, reject) => {
const release_1_12 = new Date('2017-06-02T13:50:27+00:00');
let data = await get('https://launchermeta.mojang.com/mc/game/version_manifest.json').catch(reject);
var currentReleases = data.versions.filter((v) => v.type === 'release' && new Date(v.releaseTime) >= release_1_12);
resolve(currentReleases);
});
};
router.get('/currentReleases', async (req, res) => {
res.json(await getReleases());
});
router.get('/availablePaperReleases', async (req, res) => {
let releases = await getReleases();
var currentPaperBuilds = await Promise.all(
releases.map(async (rel) => {
let buildData = await get('https://api.papermc.io/v2/projects/paper/versions/' + rel.id + '/builds').catch((err) => {});
if (buildData) {
return {
...rel,
build: buildData,
};
} else {
return rel;
}
})
);
res.json(currentPaperBuilds);
});

最新更新