Maison > Article > interface Web > Pourquoi l'utilisation de setTimeout() dans une chaîne de promesses entraîne-t-elle une erreur d'analyse JSON ?
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>
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>
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>
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!