Suppose I have this data in spanish.json:
[
   {"word": "casa", "translation": "house"},
   {"word": "coche", "translation": "car"},
   {"word": "calle", "translation": "street"}
]
And I have a Dictionary class that loads it and adds a search method:
// 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
  }
}
And I can instantiate that, and use it to look up ‘calle’ with this little single-page app:
<!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>
So far so good. But, let’s say I want to subclass Dictionary
and add a method that counts all the words and adds that 
count to the page. (Man, I need some investors.)
So, I get another round of funding and implement CountingDictionary:
class CountingDictionary extends Dictionary {
  constructor(url){
    super(url)
  }
  countEntries(){
    return this.entries.length
  }
}
The new single page app:
<!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>
When this page loads, the h1 gets populated with 0. 
I know what my problem is, I just don’t how to fix it.
The problem is that the fetch call returns a Promise,
and the .entries property is only populated with the data
from the URL once that Promise has returned. Until then,
.entries remains empty.    
How can I make .countEntries wait for the fetch promise to resolve?
Or is there a better way entirely to achieve what I want here?
 
     
     
    