Maison > interface Web > js tutoriel > Pourquoi la méthode .json() de Fetch renvoie-t-elle parfois une promesse et parfois une valeur ?

Pourquoi la méthode .json() de Fetch renvoie-t-elle parfois une promesse et parfois une valeur ?

Mary-Kate Olsen
Libérer: 2024-12-27 08:51:14
original
663 Les gens l'ont consulté

Why Does Fetch's .json() Method Sometimes Return a Promise and Sometimes Return a Value?

Exploration du comportement de promesse dans la méthode .json() de Fetch

Lors de l'exploration de l'API Fetch, une bizarrerie intrigante surgit avec la méthode .json(). Voyons pourquoi il renvoie une promesse dans certaines circonstances et une valeur directe dans d'autres.

Considérez l'extrait suivant :

fetch(url)
  .then(response => {
      return {
          data: response.json(),
          status: response.status
      }
  })
  .then(post => document.write(post.data));
Copier après la connexion

Ici, post.data génère un objet de promesse, suggérant que l'appel .json() dans le premier gestionnaire .then() renvoie une promesse.

Cependant, si nous modifions le code pour simplement enchaîner .json() :

fetch(url)
  .then(response => response.json())
  .then(post => document.write(post.title));
Copier après la connexion

post devient désormais un objet, permettant un accès direct à l'attribut title.

Pour percer ce mystère, nous devons comprendre la nature des promesses. .json() lance une opération asynchrone pour récupérer le corps de la réponse HTTP au format JSON, renvoyant une promesse. Cette promesse représente la disponibilité éventuelle des données analysées par JSON.

Lorsque la promesse est renvoyée par un gestionnaire .then() (comme dans le premier exemple), la promesse continue d'exister au sein de la chaîne. Cependant, lorsqu'une valeur est renvoyée (comme dans le deuxième exemple), la promesse est considérée comme « remplie » et la valeur renvoyée est adoptée comme résultat du .then() externe.

Pour gérer de telles situations, vous pouvez soit enchaîner les promesses en utilisant des .then() imbriqués :

fetch(url).then(response => 
    response.json().then(data => ({
        data: data,
        status: response.status
    })
).then(res => {
    console.log(res.status, res.data.title)
}));
Copier après la connexion

Ou utiliser des mots-clés asynchrones modernes comme async et wait :

const response = await fetch(url);
const data = await response.json();
console.log(response.status, data.title);
Copier après la connexion

N'oubliez pas de toujours vérifier l'état de la réponse HTTP avant de tenter d'analyser le JSON, car il se peut qu'il ne soit pas toujours dans le format attendu.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal