Promise Chains での setTimeout() の使用
Promise を使用する場合、非同期操作を適切に処理する方法を理解することが重要です。よくある問題の 1 つは、Promise チェーン内で setTimeout() を使用しようとすることです。
提供されたコード スニペットの目標は、リンクのセットを取得してから、最初のリンクのコンテンツを取得することです。ただし、setTimeout() 呼び出しは、次の Promise オブジェクトを返す前に遅延を導入するために使用されます。これにより、JSON 解析エラーが発生します。
なぜ失敗しますか?
Promise チェーンの外側で setTimeout() を使用すると、Promise チェーンが続行できなくなります。この場合、setTimeout() コールバックは Promise を返しますが、前の Promise にチェーンされていません。その結果、後続のチェーン操作は実行されません。
解決策
Promise チェーンをそのまま維持するには、.then() ハンドラーから Promise を返す必要があります。 setTimeout() 関数は、新しい Promise でラップして、Promise チェーンが維持されるようにする必要があります。
例
setTimeout() 呼び出しを次のコードに置き換えます。 :
<code class="js">return delay(1000).then(() => { return getLinks(globalObj["two"] + ".txt"); });</code>
遅延関数は setTimeout() 呼び出しを Promise にラップし、前の Promise にチェーンできるようにします。
あるいは、Promise オブジェクトを遅延して拡張することもできます。 Method:
<code class="js">Promise.prototype.delay = function(t) { return this.then(val => { return delay(t, val); }); }</code>
これにより、Promise:
<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>
以上がPromise チェーン内で setTimeout() を使用すると、JSON 解析エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。