ホームページ  >  記事  >  ウェブフロントエンド  >  Promise チェーン内で setTimeout() を使用すると、JSON 解析エラーが発生するのはなぜですか?

Promise チェーン内で setTimeout() を使用すると、JSON 解析エラーが発生するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-01 12:53:29607ブラウズ

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

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>
で .delay(x) を直接使用できるようになります。

以上がPromise チェーン内で setTimeout() を使用すると、JSON 解析エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。