异步等待 promise.all 和多个 API
Async await promise.all and multiple APIs
我想列一个清单,在每个名字旁边放上口袋妖怪和图片。我从 api 获取列表,然后将所有名称组合到通用 APi 地址并制作提取数组。我的问题是返回列表是无序的,它有 asyns await 和 console.log name(process function)。但它不起作用/你能帮我吗?
Codepen link
(async function(){
await Promise.all(arrForFetch)
.then(async files =>{
for(let i = 0; i < files.length; i++){
// console.log("files", files[i])
process( await files[i].json())
}
// files.forEach( file =>{
// console.log("files", file)
// process( file.json() )
// })
// .catch(err => console.log("tobie pizda ucziekaj"))
})
.catch(err => console.log("tobie pizda ucziekaj"))
})();
let process = (prom) => {
prom.then( data =>{
console.log(data.id)
})
}
默认情况下,Promise.all
的 return 值将保持给定的顺序。因此,在您的情况下,在 Promise.all
for arrForFetch
完成后,您将拥有一个有序的响应数据数组。
您似乎正试图将此响应数据转换为 JSON
格式,然后显示单个神奇宝贝的 ID。您也可以在此处使用 Promise.all
。我在以下代码中稍微修改了您的实现:
let arrForFetch = pokeNames.map(elem => fetch(" https://pokeapi.co/api/v2/pokemon/"+`${elem}` ) );
//multiple APis fetching
Promise.all(arrForFetch).then((jsonData) => {
// creating array to convert each of the data entries to JSON format
let JsonConversionArray = jsonData.map(data => data.json());
// Using Promise.all similar to previous implementation.
Promise.all(JsonConversionArray).then((data) => {
const idArray = data.map((pokemon) => pokemon.id);
console.log(idArray);
})
}).catch((err) => {
console.log(err);
})
但是,如果您更喜欢自己的解决方案,即没有 JSON 转换的 Promise.all
,您可以按如下方式进行:
let arrForFetch = pokeNames.map(elem => fetch(" https://pokeapi.co/api/v2/pokemon/"+`${elem}` ) );
//multiple APis fetching
Promise.all(arrForFetch).then((files) => {
// Iterating through files array
for (let i=0; i<files.length; i++) {
// You need not use await here because you are already using a then
// clause in the process() function
process(files[i].json())
}
}).catch((err) => {
console.log(err);
});
// Function to display the id of the pokemon from the JSON
function process (prom) {
prom.then(data => { console.log(data.id) })
}
我想列一个清单,在每个名字旁边放上口袋妖怪和图片。我从 api 获取列表,然后将所有名称组合到通用 APi 地址并制作提取数组。我的问题是返回列表是无序的,它有 asyns await 和 console.log name(process function)。但它不起作用/你能帮我吗? Codepen link
(async function(){
await Promise.all(arrForFetch)
.then(async files =>{
for(let i = 0; i < files.length; i++){
// console.log("files", files[i])
process( await files[i].json())
}
// files.forEach( file =>{
// console.log("files", file)
// process( file.json() )
// })
// .catch(err => console.log("tobie pizda ucziekaj"))
})
.catch(err => console.log("tobie pizda ucziekaj"))
})();
let process = (prom) => {
prom.then( data =>{
console.log(data.id)
})
}
默认情况下,Promise.all
的 return 值将保持给定的顺序。因此,在您的情况下,在 Promise.all
for arrForFetch
完成后,您将拥有一个有序的响应数据数组。
您似乎正试图将此响应数据转换为 JSON
格式,然后显示单个神奇宝贝的 ID。您也可以在此处使用 Promise.all
。我在以下代码中稍微修改了您的实现:
let arrForFetch = pokeNames.map(elem => fetch(" https://pokeapi.co/api/v2/pokemon/"+`${elem}` ) );
//multiple APis fetching
Promise.all(arrForFetch).then((jsonData) => {
// creating array to convert each of the data entries to JSON format
let JsonConversionArray = jsonData.map(data => data.json());
// Using Promise.all similar to previous implementation.
Promise.all(JsonConversionArray).then((data) => {
const idArray = data.map((pokemon) => pokemon.id);
console.log(idArray);
})
}).catch((err) => {
console.log(err);
})
但是,如果您更喜欢自己的解决方案,即没有 JSON 转换的 Promise.all
,您可以按如下方式进行:
let arrForFetch = pokeNames.map(elem => fetch(" https://pokeapi.co/api/v2/pokemon/"+`${elem}` ) );
//multiple APis fetching
Promise.all(arrForFetch).then((files) => {
// Iterating through files array
for (let i=0; i<files.length; i++) {
// You need not use await here because you are already using a then
// clause in the process() function
process(files[i].json())
}
}).catch((err) => {
console.log(err);
});
// Function to display the id of the pokemon from the JSON
function process (prom) {
prom.then(data => { console.log(data.id) })
}