Bonjour � tous,
J'utilise dans mon projet 3 fetch cons�cutifs :
Premier fetch : d�clench� au choix d'un onglet et qui ram�ne une portion de formulaire sp�cifique (boutons et input de dates)
Deuxi�me fetch : ram�ne le data et l'affiche dans la portion du formulaire pr�vue � cet effet
Je me trouve confront� au fait que le deuxi�me fetch n'attend pas que le premier ait fini de s�ex�cuter ce qui fait bien �videment que les �l�ments de la page ne sont pas tous disponibles � ce moment pr�cis ... (cas classique ...)
J'ai pour l'instant d�tourn� le probl�me en cr�ant un timeout (voir le commentaire : "filtrer au click sur un onglet" dans la fonction "onglets.js") ce qui n'est pas propre et encore moins fiable !
J'aimerai savoir comment attendre l�ex�cution du premier fetch et v�rifier l'existence des �l�ments dans la page avant que le deuxi�me "agenda-semaine.js" ne soit ex�cut� ...
J'ai essay� en rajoutant un .then dans le premier fetch puis en le transformant en fonction asynchrone mais je dois louper quelque chose car je n'arrive pas � lier une fonction � l'autre et cr�er un contr�le d�ex�cution.
Je suppose qu'il faut rajouter une fonction callback ?
Merci d'avance pour votre pr�cieuse aide
Premier fetch ("onglets.js") :
Deuxi�me fetch : (agenda-semaine.js) :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 const tabContent = document.querySelector(".tabs__content"); const radButtons = document.querySelectorAll(".tabs__radio"); export { tabContent, radButtons }; import { agendaSemaine } from "./agenda-semaine.js"; window.onload = () => { const fetchFirstTabUrl = radButtons[0].dataset.url; //fonction filtre selon l'onglet actif choisi const filtrerOnglet = async (url) => { let reponse = await fetch(url, { method: "POST", cache: "no-cache", headers: { "X-Requested-With": "XMLHttpRequest", // "Content-Type": "Application/json", }, }) .then((response) => response.json()) .then((data) => { tabContent.innerHTML = data.content; }) .catch((error) => alert("Erreur : " + error)); return reponse; }; //Chargement du premier onglet au démarrage const url = fetchFirstTabUrl; filtrerOnglet(url); //Filtrer au click sur les onglets radButtons.forEach((rb) => rb.addEventListener("change", (e) => { const url = e.target.dataset.url; filtrerOnglet(url); setTimeout(() => { if (rb.id === "agenda-semaine") { agendaSemaine(); } }, 500); }) ); };
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 import { tabContent } from "./onglets.js"; export const agendaSemaine = () => { const inputDebutSemaine = document.querySelector("#inputDebutSemaine"); const inputFinSemaine = document.querySelector("#inputFinSemaine"); //Recherche des jours pour filtre agenda semaine const ajd = new Date(); const dateDebutSemaineDefaut = new Date( ajd.setDate(ajd.getDate() - ajd.getDay() + 1) ); //Initialisation des champs date début et fin avec les dates de semaine active const dateFinSemaineDefaut = new Date(ajd.setDate(ajd.getDate() + 6)); // inputDebutSemaine.value = "2023-10-01" // inputFinSemaine.value = dateFinSemaineDefaut.toISOString().split("T")[0]; // const dateDebutSemaine = new Date(inputDebutSemaine.value) // .toISOString() // .split("T")[0]; // const dateFinSemaine = new Date(inputFinSemaine.value) // .toISOString() // .split("T")[0]; tabContent.addEventListener("change", (e) => { let btn = e.target; if (btn.id === "inputDebutSemaine" || btn.id === "inputFinSemaine") { const dateDebutSemaine = inputDebutSemaine.value; const dateFinSemaine = inputFinSemaine.value; if (dateDebutSemaine.value != null && dateFinSemaine.value != null) { rechercherParSemaine(dateDebutSemaine, dateFinSemaine); } } }); //Initialisation du filtre par semaine (Fetch) const rechercherParSemaine = (dateDebutSemaine, dateFinSemaine) => { const formData = new FormData(); formData.append("inputDebutSemaine", dateDebutSemaine); formData.append("inputFinSemaine", dateFinSemaine); for (let item of formData) { console.log(item[0], item[1]); } const reponse = fetch("/admin/rendez-vous/agenda-semaine-contenu", { method: "POST", body: formData, cache: "no-cache", headers: { "X-Requested-With": "XMLHttpRequest" }, }) .then((response) => response.json()) .then((data) => { contenuSemaine.innerHTML = data.content; }) .catch((error) => alert("Erreur " + error)); return reponse; }; }; // rechercherParSemaine(dateDebutSemaine,dateFinSemaine); // ajd.toLocaleDateString("fr-FR", { month: "long", day: "numeric" }); // rechercheJour.value = ajd; // console.log("Ajd :", ajd); // const dateActive = rechercheJour.value; // console.log(dateActive);
Partager