setTimeout によってスケジュールされるはずの関数呼び出しがすぐに実行されるのはなぜですか?[重複]
-
19-09-2019 - |
質問
この質問にはすでに答えがあります:
- setTimeout() を使用した関数の呼び出し 6 件の回答
ここが私の問題です。プロキシサーバーをテストするためにこの機能があります。
function crawl() {
var oldstatus = document.getElementById('status').innerHTML;
document.getElementById('status').innerHTML = oldstatus + "Crawler Started...<br />";
var url = document.getElementById('url').value;
var proxys = document.getElementById('proxys').value.replace(/\n/g,',');
var proxys = proxys.split(",");
for (proxy in proxys) {
var proxytimeout = proxy*10000;
setTimeout(doRequest(url,proxys[proxy]), proxytimeout);
}
}
「doRequest()」関数を約 10 秒間隔で呼び出すようにしたいのですが、setTimeout() を使用しても関数はすぐに呼び出されます。
あらゆるアイデアを歓迎します、ありがとう。
追伸:「proxytimout」に任意の値を入力しても効果はありません。
解決
、関数が実行の代わりに、setTimeoutメソッドに渡されます。あなたはそれを動作させるための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);
第二の形式は、ビットハックが、引数がスカラー値(文字列、int型など)であればそれにもかかわらず機能します。この場合には最初のオプションは、明らかにあなたのために最適に動作しますので、第三のフォーマットは、少し不明である。
他のヒント
ここでこの行は問題あります:
setTimeout(doRequest(url,proxys[proxy]), proxytimeout);
書き込みdoRequest()
は、実際には関数を呼び出しています。何が欲しいの機能自体を渡すことです。
setTimeout(doRequest, proxytime, url, proxys[proxy]);
あなたはsetTimeout
機能を誤解しています。
setTimeout
機能は、機能を取り、後でそれを実行します。
setTimeout(doRequest(url,proxys[proxy]), proxytimeout)
を書き込むことにより、あなたはdoRequest
機能(すぐに)_callingしている、とsetTimeout
に(それは別の関数を返すと仮定して)結果を渡します。
あなたはこのように、doRequest
するsetTimeout
のパラメータを渡す必要があります:
setTimeout(doRequest, proxytimeout, url, proxys[proxy]);
このは(それを最初に呼び出さず)setTimeout
doRequest
関数自体を通過し、また、パラメータは、それが最終的にそれを呼び出すときにdoRequest
に与えるためにそれを渡します。