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

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

Barbara Streisand
リリース: 2024-11-14 18:33:01
オリジナル
534 人が閲覧しました

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. としての関数文字列:

    または、評価される文字列として 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート