Maison  >  Article  >  interface Web  >  Pourquoi l'utilisation de « setTimeout » dans une chaîne de promesses provoque-t-elle une erreur d'analyse JSON ?

Pourquoi l'utilisation de « setTimeout » dans une chaîne de promesses provoque-t-elle une erreur d'analyse JSON ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-30 05:49:28398parcourir

Why Does Using `setTimeout` in a Promise Chain Cause a JSON Parsing Error?

Utilisation de setTimeout sur Promise Chain

Pour tenter d'explorer les promesses, vous avez tenté de récupérer un ensemble de liens à l'aide d'une requête initiale et de récupérer le contenu du premier lien à l’aide d’une requête ultérieure. Pour introduire un délai avant de renvoyer le prochain objet de promesse, vous avez utilisé setTimeout. Cependant, cette approche rencontre une erreur d'analyse JSON qui disparaît lorsque setTimeout() est éliminé.

Pour élucider cette erreur, il est crucial de comprendre que pour maintenir la continuité de la chaîne de promesses, vous ne pouvez pas utiliser setTimeout() comme tu l'as fait. La raison en est que vous ne renvoyez pas de promesse du gestionnaire .then(), mais plutôt du rappel setTimeout(), ce qui rend vos efforts inefficaces.

Envisagez plutôt d'implémenter une simple fonction de retard :

<code class="js">function delay(t, val) {
    return new Promise(resolve => setTimeout(resolve, t, val));
}</code>

Avec cette fonction de délai en place, vous pouvez modifier votre code comme suit :

<code class="js">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>

Cette modification garantit que vous renvoyez une promesse du gestionnaire .then(), l'enchaînant ainsi de manière appropriée.

Vous pouvez également étendre l'objet Promise avec une méthode de retard, vous permettant d'utiliser une syntaxe plus concise :

<code class="js">Promise.prototype.delay = function(t) {
    return this.then(function(val) {
        return delay(t, val);
    });
}

Promise.resolve("hello").delay(500).then(function(val) {
    console.log(val);
});</code>

En incorporant ces modifications, vous pouvez en toute transparence introduisez des retards dans votre chaîne de promesses, atténuant ainsi l'erreur d'analyse JSON rencontrée.

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!

Déclaration:
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