gpt4 book ai didi

javascript - 嵌套 Promises - 映射函数内的映射函数

转载 作者:行者123 更新时间:2023-12-02 21:17:50 25 4
gpt4 key购买 nike

基本上我有一个大数组,其中的对象值如下:

[{
- Champion Name
- [Another Array with Skins information]
}]

所以我想做的是在第二个数组中运行一个映射函数来获取每个皮肤的值,所以我所做的是。

const got = require('got');
const cheerio = require('cheerio');
const fs = require('fs').promises;

const getSkinData = async champSkins => {
const data = JSON.parse(champSkins);

const handleMap = skin => {
return new Promise(async (resolve, reject) => {
try {
const name = skin.split(' ').join('_');

const { body } = await got(`https://lol.gamepedia.com/${name}`);

const $ = cheerio.load(body);

const skinLink = $('.InfoboxSkin img').attr('src') || '';

const skinInfo = {
skinName: skin,
skinLink
};

resolve(skinInfo);
} catch (err) {
console.error(err.message);
}
});
};

Promise.all(
data.map(async ({ skins }) => {
return Promise.all(
skins.map(skin => {
return handleMap(skin);
})
);
})
).then(data => console.log(data));
};

module.exports = getSkinData;

但它实际上不起作用,我无法访问数据,最后 promise 内的 console.log 甚至没有运行。

知道如何做或者有更好的方法吗?

编辑#1

基本上每个冠军的“皮肤”都是一个字符串数组,例如:

[ 'Aatrox',          
'Justicar Aatrox',
'Mecha Aatrox',
'Sea Hunter Aatrox'
'Blood Moon Aatrox'
'Blood Moon Aatrox
'Victorious Aatrox' ]

[ 'Ahri',
'Dynasty Ahri',
'Midnight Ahri',
'Foxfire Ahri',
'Popstar Ahri',
'Challenger Ahri',
'Academy Ahri',
'Arcade Ahri',
'Star Guardian Ahri
'K/DA Ahri',
'K/DA Ahri Prestige
'Elderwood Ahri' ]

皮肤就是数组的每个值

从抓取中返回的值只是每个皮肤的链接

enter image description here

最佳答案

const getSkinData = async champSkins => {
const data = JSON.parse(champSkins);
// async that returns promise is a double promise, you only need async
const handleMap = async skin => {
try {
const name = skin.split(" ").join("_");
const { body } = await got(`https://lol.gamepedia.com/${name}`);
const $ = cheerio.load(body);
const skinLink = $(".InfoboxSkin img").attr("src") || "";
const skinInfo = {
skinName: skin,
skinLink
};
// changed resolve to return
return skinInfo;
} catch (err) {
console.error(err.message);
}
};

return await Promise.all(data.map(({ skins }) => Promise.all(skins.map(skin => handleMap(skin)))));
};

异步函数返回一个用其返回值解析的 promise ,因此从异步函数返回 promise 是多余的,最终会导致嵌套 promise 。此外,您不必在异步函数中使用 .then,因为您只需 await promise 即可。了解更多关于 Promisesasync/await .

关于javascript - 嵌套 Promises - 映射函数内的映射函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60920722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com