setTimeout による関数呼び出しの遅延実行
JavaScript では、setTimeout() を使用して関数の実行を後で実行するようにスケジュールします。非同期プログラミングの一般的なテクニック。ただし、遅延してスケジュールされているにもかかわらず、関数がすぐに実行される場合があります。 setTimeout() の複雑さを理解することは、効果的な非同期実行にとって重要です。
提供されたコンテキストでは、crawl() 関数は約 10 秒間隔で doRequest() 関数を呼び出すことを目的としています。ただし、関数はすぐに実行されます。
この問題を理解する鍵は、setTimeout() の構文にあります。関数をパラメーターとして指定する場合は、関数自体を指定し、その後に遅延を指定し、次に関数に必要な引数を指定することが重要です。
考えられる解決策:
機能、遅延、および引数:
次の方法で setTimeout() を呼び出します:
setTimeout(doRequest, proxytimeout, url, proxys[proxy]);
これにより、実行される関数として doRequest() が、遅延および必要な遅延とともに確実に渡されます。引数。
としての関数文字列:
または、評価される文字列として 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 サイトの他の関連記事を参照してください。