setTimeout によってスケジュールされるはずの関数呼び出しがすぐに実行されるのはなぜですか?[重複]

StackOverflow https://stackoverflow.com/questions/2037203

質問

この質問にはすでに答えがあります:

ここが私の問題です。プロキシサーバーをテストするためにこの機能があります。

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に機能を与えるとして、

、関数が実行の代わりに、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に与えるためにそれを渡します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top