Supposons que j'ai ces données dans spanish.json
:ES6 cours: Fetch dans la classe parente, reportez-vous à résoudre chercher dans la classe des enfants
[
{"word": "casa", "translation": "house"},
{"word": "coche", "translation": "car"},
{"word": "calle", "translation": "street"}
]
Et j'ai une classe Dictionary qui le charge et ajoute une méthode de recherche:
// Dictionary.js
class Dictionary {
constructor(url){
this.url = url;
this.entries = []; // we’ll fill this with a dictionary
this.initialize();
}
initialize(){
fetch(this.url)
.then(response => response.json())
.then(entries => this.entries = entries)
}
find(query){
return this.entries.filter(entry =>
entry.word == query)[0].translation
}
}
et je peux instancier que, et l'utiliser pour regarder « calle » avec cette petite application d'une seule page:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>spanish dictionary</title>
</head>
<body>
<p><input placeholder="Search for a Spanish word" type="">
<p><output></output>
<script src=Dictionary.js></script>
<script>
let es2en = new Dictionary('spanish.json')
console.log(es2en.find('calle')) // 'street'
input.addEventListener('submit', ev => {
ev.preventDefault();
let translation = dictionary.find(ev.target.value);
output.innerHTML = translation;
})
</script>
</body>
</html>
Jusqu'ici tout va bien. Mais, disons que je veux sous-classer Dictionary
et ajouter une méthode qui compte tous les mots et ajoute que compte à la page. (Man, j'ai besoin des investisseurs.)
Alors, je reçois une autre série de financement et mettre en œuvre CountingDictionary
:
class CountingDictionary extends Dictionary {
constructor(url){
super(url)
}
countEntries(){
return this.entries.length
}
}
La nouvelle application d'une seule page:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Counting Spanish Dictionary</title>
</head>
<body>
<p><input placeholder="Search for a Spanish word" type="">
<p><output></output>
<script src=Dictionary.js></script>
<script>
let
es2en = new CountingDictionary('spanish.json'),
h1 = document.querySelector('h1'),
input = document.querySelector('input'),
output = document.querySelector('output');
h1.innerHTML = es2en.countEntries();
input.addEventListener('input', ev => {
ev.preventDefault();
let translation = es2en.find(ev.target.value);
if(translation)
output.innerHTML = `${translation}`;
})
</script>
</body>
</html>
Lorsque cette page se charge, le h1
est rempli avec 0
.
Je sais quel est mon problème, je ne sais pas comment le réparer.
Le problème est que le retour appel fetch
un Promise
, et la propriété .entries
est peuplé que les données de l'URL, une fois que la promesse est de retour. Jusque-là, .entries
reste vide.
Comment puis-je faire .countEntries
attendre que la promesse de récupération à résoudre?
Ou y at-il un meilleur moyen de réaliser ce que je veux ici?
Ceci est assez similaire à la réponse de Frxstrem, et présente donc le même inconvénient. – pat