ホームページ > 記事 > ウェブフロントエンド > 遅延を設定しているにもかかわらず、setTimeout() 関数がすぐに実行されるのはなぜですか?
setTimeout による関数呼び出しの遅延実行
JavaScript では、setTimeout() を使用して関数の実行を後で実行するようにスケジュールします。非同期プログラミングの一般的なテクニック。ただし、遅延してスケジュールされているにもかかわらず、関数がすぐに実行される場合があります。 setTimeout() の複雑さを理解することは、効果的な非同期実行にとって重要です。
提供されたコンテキストでは、crawl() 関数は約 10 秒間隔で doRequest() 関数を呼び出すことを目的としています。ただし、関数はすぐに実行されます。
この問題を理解する鍵は、setTimeout() の構文にあります。関数をパラメーターとして指定する場合は、関数自体を指定し、その後に遅延を指定し、次に関数に必要な引数を指定することが重要です。
考えられる解決策:
関数、遅延、引数:
次の方法で setTimeout() を呼び出します:
setTimeout(doRequest, proxytimeout, url, proxys[proxy]);
これにより、doRequest() が確実に実行されます。遅延と必要な引数とともに、実行する関数として渡されます。
Function as String:
あるいは、doRequest を渡すこともできます。 () を評価される文字列として使用します:
setTimeout('doRequest('+url+','+proxys[proxy]+')', proxytimeout);
このアプローチでは必要な括弧の数が減り、より簡潔な代替手段が提供されます。
クロージャー付き匿名関数:
doRequest() を匿名関数で囲み、ループ内で引数が変更されるのを防ぎます:
(function(u, p, t) { setTimeout(function() { doRequest(u, p); }, t); })(url, proxys[proxy], proxytimeout);
この手法により、クロージャー内で使用される変数が、たとえループが進行します。ただし、前のオプションよりも少し複雑です。
特定のニーズに応じて、これらのソリューションのいずれも、意図した遅延で doRequest() の実行を効果的にスケジュールします。 setTimeout() の微妙な違いを理解することは、JavaScript で非同期プログラミングを成功させるために不可欠です。
以上が遅延を設定しているにもかかわらず、setTimeout() 関数がすぐに実行されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。