2013-09-24 3 views
1

Я использую JQWidgets, чтобы создать круговую диаграмму. И в то время как все это прекрасно и денди и работает как шарм. Однако я хотел бы обновить данные каждые x секунд. Использование JQuery, вот код, который я до сих пор:Каков оптимальный способ использования setInterval в jQuery jQuery?

function loadChart(id,name){ 
    //chart loads here 
    var speed = 5000, 
     t = setInterval(reloadData,speed); 
    function reloadData() { 
     source.url = 'data.php?id='+id; 
     var dataAdapter = new $.jqx.dataAdapter(source); 
     $('#pie').jqxChart({ source: dataAdapter }); 
     console.log('reloading pie...'+globalPieId); 
     speed = 5000; 
     clearInterval(t); 
     t = setInterval(reloadData, speed); 
    } 
} 

Моя проблема в том, что если функция loadChart называется, другой экземпляр setInterval создается, и после того, как три или четыре раза, на графике находится в постоянное состояние обновления. Как оптимизировать мой вызов setInterval для вызова только одного экземпляра?

Заранее спасибо.

+2

Попробуйте использовать 'setTimeout' вместо этого и добавьте новый тайм-аут только тогда, когда вы получили обратный вызов от последнего вызова. (что вы уже делаете, казалось бы) – lfxgroove

+1

@lfxgroove ударил ноготь по голове. Отбросьте, что 'interval' и замените его на« timeout », должно быть только несколько изменений кода, и тогда вы можете избавиться от этого' clearInterval', так как 'timeout' позаботится об этом. – tymeJV

+0

Прекрасное объяснение: http://reallifejs.com/brainchunks/repeated-events-timeout-or-interval/ –

ответ

2

Вам нужно очистить существующий интервал перед установкой нового. Попробуйте следующий трюк.

function loadChart(id, name) { 
    // We use a trick to make our 'interval' var kinda static inside the function. 
    // Its value will not change between calls to loadChart(). 
    var interval = null; 

    // This is the core of a trick: replace outer function with inner helper 
    // that remembers 'interval' in its scope. 
    loadChart = realLoadChart; 
    return realLoadChart(id, name); 

    function realLoadChart(id, name) { 
     var speed = 5000; 

     // Remove old interval if it exists, then set up a new one 
     interval && clearInterval(interval); 
     interval = setInterval(reloadData, speed); 

     function reloadData() { 
      // ... your code, but no do nothing with interval here ... 
     } 
    } 
} 
+0

Спасибо, я попробую это и вернусь к вам. – fiqbal

+0

Это работало как шарм! Хотя я действительно думаю, что метод @ lxxgroove работал бы в любых других обстоятельствах. – fiqbal

7

Вместо использования setInterval, который вызывает функцию снова и снова, вам было бы лучше использовать функцию setTimeout, которая будет вызывать обратный вызов, который вы укажете только один раз. Как только вызов будет вызван, вы можете снова позвонить setTimeout, и вы перестанете испытывать проблемы, с которыми вы сейчас сталкиваетесь. Также вы будете ждать, пока последний вызов не будет выполнен, прежде чем вы начнете делать еще одно, что тоже хорошо. Код может выглядеть следующим образом с изменением:

function loadChart(id,name){ 
    //chart loads here 
    var speed = 5000, 
     t = setTimeout(reloadData,speed); 
    function reloadData() { 
     source.url = 'data.php?id='+id; 
     var dataAdapter = new $.jqx.dataAdapter(source); 
     $('#pie').jqxChart({ source: dataAdapter }); 
     console.log('reloading pie...'+globalPieId); 
     speed = 5000; 
     t = setTimeout(reloadData, speed); 
    } 
} 

Для рабочего РОС вы могли видеть http://jsfiddle.net/9QFS2/

+0

Спасибо за ответ. Я просто попробовал это и получил ту же проблему, что и раньше. Как только функция loadChart снова вызывается с разными параметрами, диаграмма начинает обновляться несколько раз (в моем случае она обновлялась каждые 5 секунд дважды, если два экземпляра смещались на 2 секунды) – fiqbal

+1

Как вы называете 'loadChart'? – lfxgroove

+2

Это. 'setInterval' проблематично, мягко говоря. – Robusto

Смежные вопросы