setTimeout によってスケジュールされた関数がすぐに実行されないのはなぜですか?
コードは、setTimeout 関数を使用して doRequest を呼び出すプロキシ サーバーをテストしようとしています。 10秒間隔で。奇妙なことに、関数は意図したスケジュールに従うのではなく、すぐに実行されます。
問題の理解
問題は、doRequest 関数を setTimeout に渡す方法にあります。 setTimeout(doRequest(url, proxys[proxy]), proxytimeout) のように、最初の引数として関数を指定すると、その関数はすぐに呼び出されます。
Solutions
この問題を解決するには、次の 3 つのオプションがあります:
引数を別のパラメータとして渡します:
setTimeout(doRequest, proxytimeout, url, proxys[proxy]);
文字列式を使用します:
setTimeout('doRequest(' + url + ',' + proxys[proxy] + ')', proxytimeout);
クロージャ内で匿名関数を定義します:
(function(u, p, t) { setTimeout(function() { doRequest(u, p); }, t); })(url, proxys[proxy], proxytimeout);
最初のオプションは、より明確で明示的であるため、推奨されます。 2 番目のオプションは、その「ハッキーな」性質のためあまり望ましくありません。一方、3 番目のオプションは理解するのが複雑になる可能性がありますが、ループ内での値の変更を防ぎます。
以上が「setTimeout」関数がスケジュールされた時間ではなく即時に実行されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。