Je suis actuellement aux prises avec un appel function
, lorsque j'appelle la fonction d'une instruction if
cela fonctionne mais quand je l'appelle de l'extérieur, mon if
L'instruction vérifie seulement quel bouton a été enfoncé mais j'essaye de retirer la fonction du bouton et de l'appeler dès que mon application démarre.Comment appeler la fonction asynchrone pour utiliser le retour sur la portée globale
Nous examinerons fetchJokes()
l'intérieur jokeContainer.addEventListener('click', event => {
Ceci est mon code actuel:
const jokeContainer = document.querySelector('.joke-container');
const jokesArray = JSON.parse(localStorage.getItem("jokesData"));
// Fetch joke count from API endpoint
async function sizeJokesArray() {
let url = 'https://api.icndb.com/jokes/count';
let data = await (await fetch(url)).json();
data = data.value;
return data;
}
// use API endpoint to fetch the jokes and store it in an array
async function fetchJokes() {
let url = `https://api.icndb.com/jokes/random/${length}`;
let jokesData = [];
let data = await (await fetch(url)).json();
data = data.value;
for (jokePosition in data) {
jokesData.push(data[jokePosition].joke);
}
return localStorage.setItem("jokesData", JSON.stringify(jokesData));;
}
const jokeDispenser = (function() {
let counter = 0; //start counter at position 0 of jokes array
function _change(position) {
counter += position;
}
return {
nextJoke: function() {
_change(1);
counter %= jokesArray.length; // start from 0 if we get to the end of the array
return jokesArray[counter];
},
prevJoke: function() {
if (counter === 0) {
counter = jokesArray.length; // place our counter at the end of the array
}
_change(-1);
return jokesArray[counter];
}
};
})();
// pass selected joke to print on html element
function printJoke(joke) {
document.querySelector('.joke-text p').textContent = joke;
}
sizeJokesArray().then(size => (length = size)); // Size of array in response
jokeContainer.addEventListener('click', event => {
if (event.target.value === 'Fetch') {
fetchJokes(length);
} else if (event.target.value === 'Next') {
printJoke(jokeDispenser.prevJoke(jokesArray));
} else if (event.target.value === 'Prev') {
printJoke(jokeDispenser.nextJoke(jokesArray));
}
});
Et je suis en train de faire quelque chose comme ceci:
// pass selected joke to print on HTML element
function printJoke(joke) {
document.querySelector('.joke-text p').textContent = joke;
}
sizeJokesArray().then(size => (length = size)); // Size of array in response
fetchJokes(length);
jokeContainer.addEventListener('click', event => {
if (event.target.value === 'Next') {
printJoke(jokeDispenser.prevJoke(jokesArray));
} else if (event.target.value === 'Prev') {
printJoke(jokeDispenser.nextJoke(jokesArray));
}
});
Par ailleurs, Je suis conscient qu'à l'heure actuelle, vous ne pouvez pas réellement parcourir les éléments du tableau en utilisant prev et next button sans rafraîchir la page, mais je suppose que ce sera un autre q uestion.
ne pouvait pas penser à un meilleur titre. (Modifications bienvenues)
Alors pourquoi est-ce que je peux juste l'appeler 'fetchJokes()' dans mon instruction 'if'? – ricardoNava
Cela n'a rien à voir avec l'instruction 'if'. La raison pour laquelle cela fonctionne est que l'appel est dans un gestionnaire d'événements. Au moment où vous cliquez sur l'élément DOM et que le gestionnaire d'événements est exécuté, la réponse Ajax aura été reçue et 'length = size' aura été exécuté. C'est à dire. 'longueur' a une valeur autre que' 0'. –
Ok merci, je pense que je comprends maintenant, mais pourquoi cela arrive-t-il? Comme dans le cas où l'élément DOM est cliqué, la réponse Ajax a été reçue et avant cela, elle ne l'a pas été. – ricardoNava