ホームページ  >  記事  >  ウェブフロントエンド  >  遅延を設定しているにもかかわらず、setTimeout() 関数がすぐに実行されるのはなぜですか?

遅延を設定しているにもかかわらず、setTimeout() 関数がすぐに実行されるのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-14 18:33:01461ブラウズ

Why is my setTimeout() function executing immediately, despite setting a delay?

setTimeout による関数呼び出しの遅延実行

JavaScript では、setTimeout() を使用して関数の実行を後で実行するようにスケジュールします。非同期プログラミングの一般的なテクニック。ただし、遅延してスケジュールされているにもかかわらず、関数がすぐに実行される場合があります。 setTimeout() の複雑さを理解することは、効果的な非同期実行にとって重要です。

提供されたコンテキストでは、crawl() 関数は約 10 秒間隔で doRequest() 関数を呼び出すことを目的としています。ただし、関数はすぐに実行されます。

この問題を理解する鍵は、setTimeout() の構文にあります。関数をパラメーターとして指定する場合は、関数自体を指定し、その後に遅延を指定し、次に関数に必要な引数を指定することが重要です。

考えられる解決策:

  1. 関数、遅延、引数:

    次の方法で setTimeout() を呼び出します:

    setTimeout(doRequest, proxytimeout, url, proxys[proxy]);

    これにより、doRequest() が確実に実行されます。遅延と必要な引数とともに、実行する関数として渡されます。

  2. Function as String:

    あるいは、doRequest を渡すこともできます。 () を評価される文字列として使用します:

    setTimeout('doRequest('+url+','+proxys[proxy]+')', proxytimeout);

    このアプローチでは必要な括弧の数が減り、より簡潔な代替手段が提供されます。

  3. クロージャー付き匿名関数:

    doRequest() を匿名関数で囲み、ループ内で引数が変更されるのを防ぎます:

    (function(u, p, t) {
       setTimeout(function() { doRequest(u, p); }, t);
    })(url, proxys[proxy], proxytimeout);

    この手法により、クロージャー内で使用される変数が、たとえループが進行します。ただし、前のオプションよりも少し複雑です。

特定のニーズに応じて、これらのソリューションのいずれも、意図した遅延で doRequest() の実行を効果的にスケジュールします。 setTimeout() の微妙な違いを理解することは、JavaScript で非同期プログラミングを成功させるために不可欠です。

以上が遅延を設定しているにもかかわらず、setTimeout() 関数がすぐに実行されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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