// https://javascript.info/async-await

// A async function always returns a promise. Other values are wrapped in a resolved promise automatically.
// Async e Await sono solo "sintassi zuccherina" per rendere l'utilizzo delle Promise più semplice

async function f1() {
    return 1;
  }
  
  f1().then(console.log); // 1

// The keyword await makes JavaScript wait until that promise settles and returns its result.
// It can be used in async functions only
// Let’s emphasize: await literally suspends the function execution until the promise settles, 
// and then resumes it with the promise result.
async function f2() {

    let promise = new Promise((resolve, reject) => {
      setTimeout(() => resolve("done!"), 1000)
    });
  
    let result = await promise; // wait until the promise resolves (*)
  
    console.log(result); // "done!"
  }
  
  f2();

  // Tutto il codice nella stessa funzione (o nello stesso blocco di codice)
  // dopo "await" è da considerarsi nel "then()" di una promessa. Pertanto dopo
  // await, il flusso di esecuzione va fuori a quel blocco di codice. Ad esempio considera
  // il seguente esempio:
  async function exampleAsyncFunction() {
    console.log('Before await');
    await new Promise(function(resolve, reject) {
        setTimeout(() => resolve("done"), 500);
      }); // Pauses execution here until the promise resolves.
    console.log('After await');
  }
  
  console.log('Start');
  exampleAsyncFunction();
  console.log('End');

  // Il risultato sarà:
  // Start, Before Await, End, After await
  // Viene prima "End" e poi "After Await", perché
  // dopo await, il flusso di esecuzione ritorna al
  // chiamante

  // Domande
  // 
  // Why await only works in async function in javascript?
  // https://stackoverflow.com/questions/49640647/why-await-only-works-in-async-function-in-javascript
  //
  // Why using async-await
  // https://stackoverflow.com/questions/42624647/why-use-async-when-i-have-to-use-await
  //
  // Si faccia presente che non è possibile creare da zero una funzione asincrona (come
  // setInterval o fetch)
  // https://stackoverflow.com/questions/61857274/how-to-create-custom-asynchronous-function-in-javascript
  //
  // Altra domanda interessante
  // https://stackoverflow.com/questions/42624647/why-use-async-when-i-have-to-use-await