Heim  >  Artikel  >  Web-Frontend  >  Warum führt die Verwendung von setTimeout() innerhalb einer Versprechenskette zu einem JSON-Parsing-Fehler?

Warum führt die Verwendung von setTimeout() innerhalb einer Versprechenskette zu einem JSON-Parsing-Fehler?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-01 12:53:29607Durchsuche

Why does using setTimeout() inside a promise chain lead to a JSON parsing error?

SetTimeout() in Promise Chains verwenden

Bei der Arbeit mit Promises ist es wichtig zu verstehen, wie asynchrone Vorgänge richtig gehandhabt werden. Ein häufiges Problem ist der Versuch, setTimeout() innerhalb einer Versprechenskette zu verwenden.

Im bereitgestellten Code-Snippet besteht das Ziel darin, eine Reihe von Links abzurufen und dann den Inhalt des ersten Links abzurufen. Allerdings wird ein setTimeout()-Aufruf verwendet, um eine Verzögerung einzuführen, bevor das nächste Promise-Objekt zurückgegeben wird. Dies führt zu einem JSON-Parsing-Fehler.

Warum schlägt es fehl?

Die Verwendung von setTimeout() außerhalb einer Versprechenskette verhindert, dass die Versprechenskette fortgesetzt wird. In diesem Fall gibt der Rückruf setTimeout() ein Versprechen zurück, das jedoch nicht an das vorherige Versprechen gekettet ist. Folglich werden die nachfolgenden Kettenoperationen nicht ausgeführt.

Lösung

Um die Versprechenskette intakt zu halten, müssen Sie das Versprechen vom .then()-Handler zurückgeben. Die setTimeout()-Funktion sollte in ein neues Versprechen eingebunden werden, um sicherzustellen, dass die Versprechenskette beibehalten wird.

Beispiel

Ersetzen Sie den setTimeout()-Aufruf durch den folgenden Code :

<code class="js">return delay(1000).then(() => {
   return getLinks(globalObj["two"] + ".txt");
});</code>

Die Verzögerungsfunktion verpackt den setTimeout()-Aufruf in einem Versprechen, sodass er an das vorherige Versprechen gekettet werden kann.

Alternativ können Sie das Promise-Objekt mit einer Verzögerung erweitern Methode:

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

Damit können Sie .delay(x) direkt auf Versprechen verwenden:

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

Das obige ist der detaillierte Inhalt vonWarum führt die Verwendung von setTimeout() innerhalb einer Versprechenskette zu einem JSON-Parsing-Fehler?. 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