多次执行fetch

问题描述 投票:0回答:1

我已经构建了一个javascript函数来创建一个项目(=图片+标题+类别) 使用使用 fetch 的 API。 API响应后,我修改DOM以显示新的项目列表。 最初,提取进展顺利,但现在在没有任何请求的情况下执行了多次。 第一个项目已正确创建(一次),但一旦我创建第二个项目,它就会发送两次(创建 2 个项目)。如果我之后创建其他项目,则会创建 3 ou 4 次。然后下一个项目将创建 6 或 7 次,等等...

我不知道如何避免通过 fetch 多次创建项目。

// ******************************* FONCTION ENREGISTREMENT DU NOUVEAU PROJET *************************************
let errorMessage = document.getElementById("errorMessage");
async function enregistrerProjet(imageInput, titleInput, categoryInput) {
    // Création de l'objet FormData
    const formData = new FormData();
    formData.append("image", imageInput);
    formData.append("title", titleInput);
    formData.append("category", categoryInput);

    try {
        // Envoi du projet via API /works   
        const response = await fetch("http://localhost:5678/api/works", {
            method: "POST",
            headers: {
                "accept": "application/json",
                "Authorization": "Bearer " + tokenLogin,
            },
            body: formData,
        })
        const responseProjet = await response.json();
        
        if (!response.ok) {
            throw new Error(`Une erreur s'est produite lors de l'ajout d'un élément (${response.status}). Veuillez réessayer plus tard.`)
        }
        projets.push(responseProjet); // ajout du nouveau projet au tableau projets

        // Récupération de l'élément du DOM qui accueillera la galerie
        const divGallery = document.querySelector(".gallery");
        // Création d’une balise dédiée au nouveau projet
        const idProjet = document.createElement("figure");
        idProjet.id = "portfolioFigure_" + responseProjet.id;
        idProjet.dataset.idCategorie = responseProjet.categoryId;
        // Création des balises 
        const imageProjet = document.createElement("img");
        imageProjet.src = responseProjet.imageUrl;
        imageProjet.alt = responseProjet.title;
        const titreProjet = document.createElement("figcaption");
        titreProjet.innerText = responseProjet.title;
        // Rattachement de la balise projet à la division Gallery
        divGallery.appendChild(idProjet);
        idProjet.appendChild(imageProjet);
        idProjet.appendChild(titreProjet);
        // ajout d'une balise image pour affichage projet
        idProjet.classList.add("image");
        document.getElementById("modifyProject").className = "modal-masque"; // masquage de la modale
        document.getElementById("galeriePhoto").className = "modal-wrapper"; // réinitialisation de la div galeriePhoto
        masquerModaleAjoutphoto(); // Masquer la modale 2 (Ajout photo)
        // Regénération de la galerie des projets
        document.querySelector(".gallery").innerHTML = "";
        genererProjets(projets);

    } catch (error) {
            errorMessage.textContent = "Erreur d'envoi du projet."; // vérifier le code erreur *************************
            // Attendre un appui clavier
            document.addEventListener("keydown", function(event) {
                event.preventDefault();
                errorMessage.textContent = ""; // Une touche est pressée, efface le message
            });
            // Attendre un clic de souris
            document.addEventListener("click", function(event) {
                event.preventDefault();
                errorMessage.textContent = ""; // Un click est détecté, efface le message
            });
            alert(error);
    };

};
javascript fetch-api
1个回答
0
投票

我猜你没有正确清理状态。我的意思是,每次成功获取后,您都希望确保正确清理,即清除状态。我还建议您添加 .removeEventListener,以便事件侦听器被多次添加。

我的朋友,编码最好。 !

© www.soinside.com 2019 - 2024. All rights reserved.