Próbuję uzyskać każdą linkę tablicy w pewnym przedziale. Na przykład: otrzymuję pierwszy link, poczekaj na 30 sekund, następny link, poczekaj na 30 sekund kolejny link itp. Oto mój kod:

var urls = [ 'http://mylink1','http://mylink2','http://mylink3','http://mylink4'];

setInterval(function(){
        urls.forEach(function(entry){
            console.log(entry);
            ajaxd(entry);
            console.log("merge pana aici");
        });
    },30000);

function ajaxd(my_url) {
    $.ajax({
        type : "POST",
        url : my_url,
        success : function(msg) {
            console.log(my_url);
        }
    });
}

I problem polega na 30 sekundach dostaję wszystkie linki. Nie pierwsza wartość, odczekaj 30 sekund, następna wartość i tak dalej ..

3
user3863229 12 sierpień 2014, 09:08

7 odpowiedzi

Najlepsza odpowiedź

Edytuj kod , aby powtórzyć pętlę.

(function() {

  var urls = ['http://mylink1', 'http://mylink2', 
              'http://mylink3', 'http://mylink4'];

  // Start off at the first element.
  var idx = 0;
  var len = urls.length;

  // Do the next link
  function doNext() {
    var entry = urls[idx];

    console.log(idx + ":" + entry);
    //ajaxd(entry);

    idx++;
    console.log([idx, len]);
    if (idx < len) {
      // Don't do anything special
    }  else {
      // Reset the counter
      idx = 0;
    }
    setTimeout(doNext, 300);      }

  // And the code needs kicked off somewhere
  doNext();

}());//end of function 
3
Jeremy J Starcher 12 sierpień 2014, 07:04

Sprawia, że foreach iteruje wszystkie wartości w tablicy natychmiast po interwałie.

Lepszym rozwiązaniem nie jest itera ...

Na przykład

var counter = 0;

setInterval(function(){
  if(counter < url.length){
    ajaxd(url[counter]);
    counter++;
  }else
    return;
}, 30000);
1
Xlander 12 sierpień 2014, 05:19

Jeśli nadal chcesz używać Foreach Aby zapętlić tablicę, można go używać z ustalaniem nie z SetInterval.

var urls = ['http://mylink1', 'http://mylink2', 'http://mylink3', 'http://mylink4'],
    interval = 2000, //  = 2s
    increment = 1;

urls.forEach(function(url) {
  var runner = setTimeout(function() {
    // Do your stuff.
    console.log(url);

    clearTimeout(runner);
  }, interval * increment);

  increment = increment + 1;
});
1
Tpn Knvl 13 maj 2016, 16:29

W swoim zamknięciu używasz pętli, aby poprosić o wszystkie elementy naraz.

0
Charles Smartt 12 sierpień 2014, 05:16
var urls = ['http://mylink1','http://mylink2','http://mylink3','http://mylink4'],

var request = function(index) {
    $.ajax({
        type : "POST",
        url : urls[index],
        success : function(content) {
            console.log(content);
            if (index + 1 < urls.length) {
                setTimeout(function () {
                    request(index + 1);
                }, 30 * 1000); // 30s
            }
        }
    });
}

request(0);
0
Junle Li 12 sierpień 2014, 05:27

Robisz to źle, spróbuj utworzyć licznik co 30 sekund. Sprawdź ten kod:

$(document).ready(function(){

    var urls = [ 'http://mylink1','http://mylink2','http://mylink3','http://mylink4'],
        counter = 0;

        obj = {}

    obj.ajaxd = function(my_url) {
        $.ajax({
            type : "POST",
            url : my_url,
            success : function(msg) {
                console.log(my_url);
            }
        });
    }

    obj.leftInterval = setInterval(function(){
        if(urls[counter] != undefined){
            obj.ajaxd(urls[counter]);   
            counter++;
        }else{
            counter = 0;
         }

     },30000);

 });
0
Robert Allan Hennigan Leahy 12 sierpień 2014, 07:08

Użyj tego:

var urls = [ 'http://mylink1','http://mylink2','http://mylink3','http://mylink4'];
urls.reverse();
var interval = setInterval(function(){ 
    if(urls.length == 0){
        clearInterval(interval);
        return;
    }
    var entry = urls.pop();
    console.log(entry);
    ajaxd(entry);
    console.log("merge pana aici");
}, 30000);

Zauważ, że to zmienia twoją tablicę. Usunie z nich elementy, dopóki nie będzie pusty.

Edytuj: na podstawie komentarza Andrei, dodano instrukcję powrotną po Clearterval :) dzięki.

0
pratyush 13 sierpień 2014, 06:21