16

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

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() を使用しても関数はすぐに呼び出されます。

どんなアイデアでも大歓迎です、ありがとう。

PS: 'proxytimout' に任意の値を指定しても効果はありません。

4

3 に答える 3

14

その形式で関数を setTimeout に渡すと、関数は setTimeout に渡される代わりに実行されます。それを機能させるには、次の 3 つの方法があります。

最初に関数を指定し、次にタイムアウトとパラメーターを最後の引数として指定します。

setTimeout(doRequest, proxytimeout, url, proxys[proxy]);

または、評価される文字列を書くだけです:

setTimeout('doRequest('+url+','+proxys[proxy]+')', proxytimeout);

3 番目のスタイルは、関数を呼び出す無名関数を渡すことです。この場合、値がループ内で変更されないようにクロージャーで実行する必要があるため、少し注意が必要です。

(function(u, p, t) {
    setTimeout(function() { doRequest(u, p); }, t);
})(url, proxys[proxy], proxytimeout);

2 番目の形式は少しハックですが、引数がスカラー値 (文字列、整数など) である場合でも機能します。3 番目の形式は少しわかりにくいため、この場合は最初のオプションが最適です。

于 2010-01-10T14:06:22.863 に答える
1

この行が問題です:

setTimeout(doRequest(url,proxys[proxy]), proxytimeout);

書き込みdoRequest()は、実際に関数を呼び出すことです。あなたが望むのは、関数自体を渡すことです:

setTimeout(doRequest, proxytime, url, proxys[proxy]);
于 2010-01-10T14:06:19.760 に答える
0

あなたはsetTimeout機能を誤解しています。

setTimeout関数は関数を受け取り、後で実行します。
を書くことsetTimeout(doRequest(url,proxys[proxy]), proxytimeout)で、関数を (すぐに) _calling しdoRequest、結果を (別の関数を返すと仮定して) に渡しますsetTimeout

次のように、doRequestのパラメータをに渡す必要があります。setTimeout

setTimeout(doRequest, proxytimeout, url, proxys[proxy]);

これによりsetTimeout、関数自体が (最初に呼び出されることなく) 渡され、最終的に呼び出されたときにdoRequest渡されるパラメーターも渡されます。doRequest

于 2010-01-10T14:07:49.973 に答える