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!