Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
311 views
in Technique[技术] by (71.8m points)

javascript - All timers created in loop (with setTimeout) fire at same time?

Can someone explain why i cant get the desired delay between each request?
They are all happening at once.

$(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
        };
    });
});

I know im using a Greasemonkey specific function, but the question is about javascript.
No GM knowledge required. :)

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The loop is run just instantly and delay every execution of conectar function for 2000ms from the time code is exectued.

For simple case I'd use:

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...