Maison > interface Web > js tutoriel > 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
Libérer: 2024-10-30 05:49:28
original
482 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

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