2016-09-21 37 views
2

我使用.each()迭代JSON文件。我希望我的頁面顯示數據3秒鐘,暫停3秒鐘,然後轉到下一個並重復。我有這樣的代碼:

$.getJSON(url,function(json1){ 
        $.each(json1.data,function(numb){ 
         setTimeout(function() { 
          alert(json1.data[numb]["title"]); 
         },3000); 

        });  

      }); 

我認爲這會做,但3秒這只是等待,然後顯示在連續數據的每一位,我需要他們每三秒鐘。

我該怎麼做?謝謝!

編輯:好吧,用這段代碼: var num = 0;

   $.getJSON(url,function(json1){ 

        $.each(json1.data,function(broj){ 

         setTimeout(function() { 

          $(".bubble").text(json1.data[broj]["text"]);  

         },6000*num); 
         num++; 
        }); 



      }); 

但是,對於使用setInterval(func,3000)來顯示數據的其他元素來說,這大約遲了半秒。爲什麼可以修復?我真的很感興趣。

回答

2

時報指數: -

$.getJSON(url, function(json1) { 
    $.each(json1.data, function(numb) { 
    setTimeout(function() { 
     alert(json1.data[numb]["title"]); 
    }, 3000 * num); 
    }); 
}); 

這將使得1 0秒,第2次3秒,3日6秒,等

,或者你想第一次也等待,使用:

3000 * (num+1) 
+0

爲什麼這種事遲到了嗎?它並不是真的馬上開始,它晚了大約一秒。這是一個問題,因爲我有其他的事情與setInterval(f,3000)關閉,他們不同步。 – Dionysus

1

這是因爲setTimeout沒有阻塞,所以每個循環通過聲明所有超時飛行,然後3秒鐘後它們全部火。您可能會將setTimeouts鏈接在一起,幾乎可以遞歸地調用它們。在每個setTimeout內部,你會調用下一個setTimeout傳遞下一個數據元素,而不是每個循環(可能仍然需要某種類型的計數器來增加,所以你有一個物品索引,增加它並在setTimeout中進行邊界檢查。 。這樣下一個setTimeout纔會被聲明,直到前一個完成。

其實我只是做了一件最近設置警示欄,每5秒顯示的文本來自像數組改變:

var speed = 5000; /*this is the time in milliseconds adjust to suit*/ 

    function showAlert(x) { 
     if (!x || x > (sysAlert.length - 1) || x < 0) x = 0; 
     document.getElementById("alertBar").innerHTML = sysAlert[x]; 
     return setTimeout(showAlert, speed, ++x); 
    } 
    showAlert(0); 
1
var count = 0; 

$.each(mydata, function(data){ 
count++; 
setTimeout(function() { 
         console.log(data); 
        },3000 * count); 
}) 
0

假設指數numb是數字:

$.getJSON(url,function(json1){ 

    var numb = 0; // starting point of array 

    var iterate = function(){ 
     if(json1.data[numb]){ // only setTimeout if this index exists 
      alert(json1.data[numb++]["title"]); 
      setTimeout(iterate, 3000); 
     } 
    } 

    // show the first result immediately 
    iterate(); 

    // OR 

    // show the first result 3000 milliseconds after the data is loaded 
    // setTimeout(iterate, 3000); 
});