2012-04-02 8 views
0

誰かがそれぞれの要求の間に希望する遅延を得ることができない理由を説明することができますか?
これらはすべて同時に起こります。ループで作成されたすべてのタイマー(setTimeout付き)は同時に起動しますか?

$(window).load(function(){ 
    $('a[href]').each(function(){ 
     var linkk = $(this) 
     var linkkhref = linkk.attr('href'); 

     window.setTimeout(function(){ conectar('HEAD', linkkhref, resp) }, 2000) 

     function conectar(metodo, endereco, resposta, corpo) { 
      callback = function(xhr) { resposta(xhr) }; 
      GM_xmlhttpRequest({ 
       "method" : metodo, 
       "url"  : endereco, 
       "onerror" : callback, 
       "onload" : callback, 
       "headers" : {'Content-Type':'application/x-www-form-urlencoded'}, 
       "data" : corpo 
      }); 
     }; 

     function resp(responseDetails) { 
      // my response code here 
     }; 
    }); 
}); 

私はGreasemonkey固有の機能を使用していますが、質問はjavascriptに関するものです。
GMの知識は必要ありません。 :)

答えて

4

ループだけで即座に実行し、exectuedされているタイムコードから2000ミリ秒のためにconectar機能のすべての実行を遅らせるています。シンプルなケースでは

私が使用したい:

$('a[href]').each(function(idx){ 
    ... 
    window.setTimeout(function(){ conectar('HEAD', linkkhref, resp) }, idx*2000) 
+1

すべての回答は完璧に機能しました。これは私のコードでは何も変わっていないので、これを正しいものに投票しました。ちょうど 'idx' – RASG

3

すべてのリンクのためにsetTimeoutがすぐに呼び出されます。あなたが呼び出し間の遅延にしたい場合は、このような何かをする必要があります。

var delay = 2000; 
$('a[href]').each(function(){ 
    var linkk = $(this) 
    var linkkhref = linkk.attr('href'); 

    window.setTimeout(function(){ conectar('HEAD', linkkhref, resp) }, delay); 
    delay += 2000; 
    .... 
2

ユージンはsetTimeoutsが一度にすべてを発生しているからだと、上記の言ったように。あなたがそれらを次々と実行X秒を開始している気にすべての場合には、当然のことながら

$(function() { 
    // dfd is our "master" deferred, which we will use to pipe the requests, one at a time 
    var dfd = $.Deferred(); 
    // set the deferred to resolve in 2 seconds, which will start the pipeline 
    window.setTimeout(dfd.resolve, 2000); 

    $('a[href]').each(function() { 
    var linkk = $(this); 
    var href = linkk.attr('href'); 
    var req = conectar(...) 
    // replace the master deferred object with one that pipes into the next request 
    dfd = dfd.pipe(req); 
    }); 

    dfd.done(function() { alert("All requests completed!") }); 
}); 

:あなたはjQueryのを使用しているので、あなたが行うことができます一つのことは、シーケンス内のすべてのコールを実行するためにjQueryのDeferredオブジェクトを使用しています、他の答えはうまくいくでしょう。この方法では、効果的に連鎖して、前のものが完了すると同時に次のものが始まるように、そしてすべてが完了したときに(dfd.doneを使用して)通知することができます。

関連する問題