Javascript 如何计算失败承诺的数量?
我正在开发一个小型Javascript应用程序,该应用程序使用来自的API。基本上,它应该从API中获取一些数据,然后将它们显示在HTML页面上。以下是代码的主要部分:Javascript 如何计算失败承诺的数量?,javascript,Javascript,我正在开发一个小型Javascript应用程序,该应用程序使用来自的API。基本上,它应该从API中获取一些数据,然后将它们显示在HTML页面上。以下是代码的主要部分: const searchInput= document.querySelector(".recherche-poke input"); let allPokemon= []; let tableauFin= []; const listePoke= document.querySelector('.liste
const searchInput= document.querySelector(".recherche-poke input");
let allPokemon= [];
let tableauFin= [];
const listePoke= document.querySelector('.liste-poke');
function fetchPokemonBase(){
fetch("https://pokeapi.co/api/v2/pokemon?limit=75")
.then(reponse => reponse.json())
.then((allPoke) =>{
allPoke.results.forEach((pokemon) =>{
fetchPokemonComplet(pokemon);
})
})
}
fetchPokemonBase();
function fetchPokemonComplet(pokemon){
let objPokemonFull = {};
let url = pokemon.url;
let nameP = pokemon.name;
fetch(url)
.then(reponse => reponse.json())
.then((pokeData) => {
objPokemonFull.pic = pokeData.sprites.front_default;
objPokemonFull.type = pokeData.types[0].type.name;
objPokemonFull.id = pokeData.id;
fetch(`https://pokeapi.co/api/v2/pokemon-species/${nameP}`)
.then(reponse => reponse.json())
.then((pokeData) => {
objPokemonFull.name= pokeData.names[4].name;
allPokemon.push(objPokemonFull);
if(allPokemon.length === 75){
tableauFin= allPokemon.sort((a, b) => {
return a.id - b.id;
}).slice(0, 21);
createCard(tableauFin);
}
})
});
}
function createCard(arr){
for(let i= 0; i< arr.length; i++){
console.log(i + '\n');
const carte= document.createElement("li");
const txtCarte= document.createElement('h5');
txtCarte.innerText= arr[i].name;
const idCarte= document.createElement('p');
idCarte.innerText= `ID# ${arr[i].id}`;
const imgCarte= document.createElement('img');
imgCarte.src= arr[i].pic;
carte.appendChild(imgCarte);
carte.appendChild(txtCarte);
carte.appendChild(idCarte);
listePoke.appendChild(carte);
}
}
这段代码可以工作,但只有在所有请求都没有失败的情况下才能工作。否则,数组allPokemon
的长度永远不会达到75,其余代码将不会执行。当我运行代码时,我继续运行,脚本在显示数据之前停止,这(我想)是导致承诺之一失败的原因。我尝试了类似于if(allPokemon.length==74)
(例如,如果我有一个错误)的方法,代码运行得很好,但这肯定不是解决方案
有没有一种方法可以让我“计算”我从请求中得到的错误,这样我就可以做类似于if(allPokemon.length==75-errorscont)
或者有一种更聪明的方法来编写我的代码
提前感谢。据我所知,您将从第一次API调用中收到0到75个口袋妖怪的列表。然后,您将获取每个条目,不管它返回多少条,最多75条条目 所以,我想你只需要确保你的列表不是空的:
if(allPokemon.length>0)
我认为您可以使用promise all来实现这一点。
因此,您要做的不是在foreach中执行fetch,而是将每个fetch推送到一个承诺数组中。然后我们使用promise.all来执行它们,对于每个承诺,我们都会发现错误。因此,如果一个失败了,下一个承诺就会继续下去
通过这段代码,我们将单个口袋妖怪的每次抓取都推送到一个数组中:
promises.push(fetchPokemonComplet(pokemon).catch(error => console.error(error)));
然后我们有一系列承诺,这些承诺是对服务器的回迁。
通过下面的代码,我们执行这些承诺
Promise.all(promises)
.then(() => {
tableauFin= allPokemon.sort((a, b) => {
return a.id - b.id;
}).slice(0, 21);
createCard(tableauFin);
})
当所有的承诺都完成时,then on promise.all将被执行。
既然我们抓住了每一个承诺,我们就不必为此担心。
我们不在乎长度,也不必计算。
让我知道它是否有效,或者是否需要任何帮助。您可以使用promise.catch()来增加全局变量。我已经尝试使用
.catch((error)=>{console.log(error);err+=1})
对每个fetch()
函数执行操作,但没有成功err
始终保持在0上,并且没有登录控制台。感谢您的回复。但这实际上会在第一个元素被推入allPokemon
后立即执行代码,并在每次添加新元素时重复。非常感谢您的回答!成功了!我第一次发布它时,我得到了一些复制品,但我不知道为什么。我第二次启动它,它运行得很好。我检查了控制台上的计数器
,结果显示为74。谢谢。没问题,你不用担心计数!
promises.push(fetchPokemonComplet(pokemon).catch(error => console.error(error)));
Promise.all(promises)
.then(() => {
tableauFin= allPokemon.sort((a, b) => {
return a.id - b.id;
}).slice(0, 21);
createCard(tableauFin);
})