Heim >Web-Frontend >js-Tutorial >Warum unterbricht die Verwendung von setTimeout in einer Versprechenskette die Kette und wie kann das Problem behoben werden?

Warum unterbricht die Verwendung von setTimeout in einer Versprechenskette die Kette und wie kann das Problem behoben werden?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-29 02:48:021082Durchsuche

Why does using setTimeout in a promise chain break the chain, and how can it be fixed?

Verwendung von setTimeout in der Promise-Kette

Promises bieten eine sequentielle Reihenfolge asynchroner Vorgänge, sodass Entwickler mit Callback-basiertem Code so arbeiten können, als ob er es wäre waren synchron. Allerdings kann die Einführung von Verzögerungen zwischen Vorgängen in einer Versprechenskette eine Herausforderung darstellen.

Frage:

Im bereitgestellten Codeausschnitt wird mit setTimeout versucht, eine Verzögerung herbeizuführen, was jedoch zur Folge hat in einem JSON-Analysefehler. Warum tritt das auf und wie kann es gelöst werden?

<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>

Antwort:

Das Problem entsteht, weil setTimeout kein Versprechen zurückgibt. Wenn Sie einen Wert aus einer Versprechenskette zurückgeben, wird dieser standardmäßig in ein aufgelöstes Versprechensobjekt eingeschlossen. Da setTimeout jedoch eine Timer-ID zurückgibt, ist die Versprechenskette unterbrochen und der zurückgegebene Wert wird nicht als Versprechen behandelt.

Um dieses Problem zu lösen, können die folgenden Ansätze verwendet werden:

1. Erstellen Sie eine Verzögerungsfunktion außerhalb der Promise-Kette:

Anstatt setTimeout zu verwenden, definieren Sie eine Verzögerungsfunktion, die die Verzögerung in ein Promise einschließt:

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

Aktualisierter Code:

<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. Fügen Sie dem Promise-Objekt eine Verzögerungsmethode hinzu:

Eine elegantere Lösung besteht darin, das Promise-Objekt um eine Verzögerungsmethode zu erweitern:

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

Aktualisierter Code:

<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>

Durch die Verwendung dieser Techniken können Sie Verzögerungen in Versprechensketten einführen, ohne das Verkettungsverhalten zu beeinträchtigen und Laufzeitfehler zu vermeiden.

Das obige ist der detaillierte Inhalt vonWarum unterbricht die Verwendung von setTimeout in einer Versprechenskette die Kette und wie kann das Problem behoben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn