Грамотный setTimeout
Добрый день. Есть функция которая берет данные и пушит их в массив, потом уже эти данные обновляются раз в минуту от клиента. Выглядит это так:
getData (); function getData (){ $.getJSON( 'index', function(data) { createData(data); }) } function createData(data){ var inputdata = []; for (i = 0; i < data.length; i++){ var arr = [+data[i].time, +data[i].sum]; inputdata.push(arr); } createTrend(inputdata); } function createTrend(inputdata){ //работаем с этими данными, добавление новых данных setTimeout(function() { createTrend(inputdata); }, 60000); } Сам вопрос: Нужно так же запускать функцию createTrend но с пустым массивом, как это сделать? Я переделывал так: getData (false); //допустим надо обнулить данные уже работающей функции function getData (reload){ $.getJSON( 'index', function(data) { createData(data, reload); }) } function createData(data, reload){ var inputdata = []; if(reload){ //если функция запущенна после загрузки страницы пушим данные for (i = 0; i < data.length; i++){ var arr = [+data[i].time, +data[i].sum]; inputdata.push(arr); } }else{ // если функция запущенна уже вручную стираем данные inputdata.length = 0; } createTrend(inputdata); } function createTrend(inputdata){ if (createTrend.id !== undefined ) { clearTimeout(getData.id); }; //работаем с этими данными, добавление новых данных createTrend.id = setTimeout(function() { createTrend(inputdata); }, 60000); } После исправления в первый раз массив очищается, а уже потом откуда то достается старый массив. Я так понимаю убивается clearTimeout новой функции, а не старой. Как убить setTimeout у старой функции чтоб оно не обновлялось, а старый массив стерся? Для большего пояснения нужно, чтобы клиент открыв страницу получил данные из базы в массив, и массив обновлялся раз в минуту (это сделано). Теперь надо добавить возможность обнуления этого массива чтобы функция createTrend обрабатывала пустой массив, и эта же функция createTrend запущенная до этого прекратила свою работу. :blink: |
юю
|
Вынес массив за пределы функции, вроде все работает, но это не хорошо :blink:
var inputdata = []; getData (false); //допустим надо обнулить данные уже работающей функции function getData (reload){ $.getJSON( 'index', function(data) { createData(data, reload); }) } function createData(data, reload){ if(reload){ //если функция запущенна после загрузки страницы пушим данные for (i = 0; i < data.length; i++){ var arr = [+data[i].time, +data[i].sum]; inputdata.push(arr); } }else{ // если функция запущенна уже вручную стираем данные inputdata.length = 0; } createTrend(); } function createTrend(){ if (createTrend.id !== undefined ) { clearTimeout(getData.id); }; //работаем с этими данными, добавление новых данных createTrend.id = setTimeout(function() { createTrend(); }, 60000); } |
используй в createTrend setInterval вместо setTimeout
и тело ф-ции туда помести и при вызове createTrend делай возврат setInterval и при вызове createData обнуляй текущий интервал схематично, как-то так var inputdata = []; getData(false); //допустим надо обнулить данные уже работающей функции var currentInterval = null function getData(reload) { createData(data, reload); } function createData(data, reload) { clearInterval(currentInterval) currentInterval = createTrend(); } function createTrend() { return setInterval(function () { //body function }, 60000); } |
SuperZen,
Спасибо, суть понятна :thanks: |
Часовой пояс GMT +3, время: 14:08. |