Utilisation de setTimeout sur la chaîne de promesses
Les promesses fournissent un ordre séquentiel d'opérations asynchrones, permettant aux développeurs de travailler avec du code basé sur le rappel comme s'il étaient synchrones. Cependant, l'introduction de délais entre les opérations dans une chaîne de promesses peut poser des problèmes.
Question :
Dans l'extrait de code fourni, un délai est tenté à l'aide de setTimeout, mais il en résulte dans une erreur d'analyse JSON. Pourquoi cela se produit-il et comment peut-il être résolu ?
<code class="javascript">... getLinks('links.txt').then(function(links){ let all_links = (JSON.parse(links)); globalObj=all_links; return getLinks(globalObj["one"]+".txt"); }).then(function(topic){ writeToBody(topic); setTimeout(function(){ return getLinks(globalObj["two"]+".txt"); // without setTimeout it works fine },1000); }); ...</code>
Réponse :
Le problème se pose car setTimeout ne renvoie pas de promesse. Par défaut, lorsque vous renvoyez une valeur d'une chaîne de promesse, elle est enveloppée dans un objet de promesse résolu. Cependant, puisque setTimeout renvoie un ID de minuterie, la chaîne de promesse est rompue et la valeur renvoyée n'est pas traitée comme une promesse.
Pour résoudre ce problème, les approches suivantes peuvent être utilisées :
1. Créez une fonction de délai en dehors de la chaîne de promesse :
Au lieu d'utiliser setTimeout, définissez une fonction de délai qui enveloppe le délai dans une promesse :
<code class="javascript">function delay(t, val) { return new Promise(resolve => setTimeout(resolve, t, val)); }</code>
Code mis à jour :
<code class="javascript">... getLinks('links.txt').then(function(links){ let all_links = (JSON.parse(links)); globalObj=all_links; return getLinks(globalObj["one"]+".txt"); }).then(function(topic){ writeToBody(topic); // return a promise here that will be chained to prior promise return delay(1000).then(function() { return getLinks(globalObj["two"]+".txt"); }); }); ...</code>
2. Ajoutez une méthode de délai à l'objet Promise :
Une solution plus élégante consiste à étendre l'objet Promise avec une méthode de délai :
<code class="javascript">Promise.prototype.delay = function(t) { return this.then(function(val) { return delay(t, val); }); }</code>
Code mis à jour :
<code class="javascript">... getLinks('links.txt').then(function(links){ let all_links = (JSON.parse(links)); globalObj=all_links; return getLinks(globalObj["one"]+".txt"); }).then(function(topic){ writeToBody(topic); // return a promise using the delay method return Promise.resolve().delay(1000).then(function() { return getLinks(globalObj["two"]+".txt"); }); }); ...</code>
En utilisant ces techniques, vous pouvez introduire des retards dans les chaînes de promesses sans compromettre le comportement de chaînage et en évitant les erreurs d'exécution.
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!