Maison > interface Web > js tutoriel > le corps du texte

Pourquoi l'utilisation de setTimeout() dans une chaîne de promesses entraîne-t-elle une erreur d'analyse JSON ?

Mary-Kate Olsen
Libérer: 2024-11-01 12:53:29
original
606 Les gens l'ont consulté

Why does using setTimeout() inside a promise chain lead to a JSON parsing error?

Utilisation de setTimeout() dans les chaînes de promesses

Lorsque vous travaillez avec des promesses, il est important de comprendre comment gérer correctement les opérations asynchrones. Un problème courant consiste à tenter d'utiliser setTimeout() dans une chaîne de promesses.

Dans l'extrait de code fourni, l'objectif est de récupérer un ensemble de liens, puis de récupérer le contenu du premier lien. Cependant, un appel setTimeout() est utilisé pour introduire un délai avant de renvoyer le prochain objet promis. Cela conduit à une erreur d'analyse JSON.

Pourquoi cela échoue-t-il ?

L'utilisation de setTimeout() en dehors d'une chaîne de promesse empêche la chaîne de promesse de continuer. Dans ce cas, le rappel setTimeout() renvoie une promesse, mais elle n'est pas enchaînée à la promesse précédente. Par conséquent, les opérations de chaîne suivantes ne sont pas exécutées.

Solution

Pour conserver la chaîne de promesse intacte, vous devez renvoyer la promesse du gestionnaire .then(). La fonction setTimeout() doit être enveloppée dans une nouvelle promesse, garantissant que la chaîne de promesses est maintenue.

Exemple

Remplacez l'appel setTimeout() par le code suivant :

<code class="js">return delay(1000).then(() => {
   return getLinks(globalObj["two"] + ".txt");
});</code>
Copier après la connexion

La fonction delay enveloppe l'appel setTimeout() dans une promesse, lui permettant d'être enchaîné à la promesse précédente.

Vous pouvez également étendre l'objet Promise avec un délai méthode :

<code class="js">Promise.prototype.delay = function(t) {
   return this.then(val => {
      return delay(t, val);
   });
}</code>
Copier après la connexion

Cela vous permet d'utiliser .delay(x) directement sur les promesses :

<code class="js">getLinks('links.txt')
   .then((links) => {
      return getLinks(globalObj["one"] + ".txt");
   })
   .then((topic) => {
      return Promise.resolve(topic).delay(1000);
   })
   .then((topic) => {
      return getLinks(globalObj["two"] + ".txt");
   });</code>
Copier après la connexion

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!