Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何计算失败承诺的数量?_Javascript - Fatal编程技术网

Javascript 如何计算失败承诺的数量?

Javascript 如何计算失败承诺的数量?,javascript,Javascript,我正在开发一个小型Javascript应用程序,该应用程序使用来自的API。基本上,它应该从API中获取一些数据,然后将它们显示在HTML页面上。以下是代码的主要部分: const searchInput= document.querySelector(".recherche-poke input"); let allPokemon= []; let tableauFin= []; const listePoke= document.querySelector('.liste

我正在开发一个小型Javascript应用程序,该应用程序使用来自的API。基本上,它应该从API中获取一些数据,然后将它们显示在HTML页面上。以下是代码的主要部分:

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);
                })