web-dev-qa-db-fra.com

async / wait renvoie toujours la promesse

J'essaie la fonctionnalité asynchrone/attente. J'ai un tel code imitant une demande:

const getJSON = async () => {
  const request = () => new Promise((resolve, reject) => (
    setTimeout(() => resolve({ foo: 'bar'}), 2000)
  ));

  const json = await request();
  return json;
}

Quand j'utilise le code de cette façon

console.log(getJSON()); // returns Promise

il retourne une promesse

mais quand j'appelle cette ligne de code

getJSON().then(json => console.log(json)); // prints { foo: 'bar' }

il imprime json comme prévu

Est-il possible d'utiliser uniquement du code comme console.log(getJSON())? Qu'est-ce que je ne comprends pas?

26
user3309314

Chaque fonction async renvoie un objet Promise. L'instruction await fonctionne sur un Promise, en attendant que Promiseresolves ou rejects.

Donc non, vous ne pouvez pas faire console.log Directement sur le résultat d'une fonction asynchrone, même si vous utilisez await. L'utilisation de await fera attendre votre fonction puis renverra un Promise qui se résout immédiatement, mais il ne déroulera pas le Promise pour vous. Vous devez toujours déballer la Promise renvoyée par la fonction async, soit à l'aide de await, soit à l'aide de .then().

Lorsque vous utilisez .then() au lieu de console.log Ging directement, la méthode .then() met le résultat de la promesse à votre disposition. Mais vous ne pouvez pas obtenir le résultat du Promise de à l'extérieur de la promesse. Cela fait partie du modèle de travail avec Promises.

41
Pedro Castilho

valeur de retour d'une fonction asynchrone sera toujours un objet AsyncFunction , qui renverra un Promise lors de l'appel. Vous ne pouvez pas modifier ce type de retour. Le point de async/await consiste à attendre facilement la fin d'un autre processus asynchrone dans une fonction asynchrone.

1
Ozan