Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.09.2018, 15:42
Профессор
Отправить личное сообщение для Artur_Hopf Посмотреть профиль Найти все сообщения от Artur_Hopf
 
Регистрация: 13.03.2018
Сообщений: 278

Грамотный 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 запущенная до этого прекратила свою работу.
Ответить с цитированием
  #2 (permalink)  
Старый 26.09.2018, 16:17
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

юю
Ответить с цитированием
  #3 (permalink)  
Старый 26.09.2018, 16:32
Профессор
Отправить личное сообщение для Artur_Hopf Посмотреть профиль Найти все сообщения от Artur_Hopf
 
Регистрация: 13.03.2018
Сообщений: 278

Вынес массив за пределы функции, вроде все работает, но это не хорошо
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);
}
Ответить с цитированием
  #4 (permalink)  
Старый 26.09.2018, 17:19
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

используй в 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);
    }
Ответить с цитированием
  #5 (permalink)  
Старый 27.09.2018, 07:50
Профессор
Отправить личное сообщение для Artur_Hopf Посмотреть профиль Найти все сообщения от Artur_Hopf
 
Регистрация: 13.03.2018
Сообщений: 278

SuperZen,
Спасибо, суть понятна
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли применять setTimeout внутри цикла? MC-XOBAHCK Общие вопросы Javascript 12 27.04.2018 17:34
SetTimeOut анимация javascript thystruby Общие вопросы Javascript 1 15.09.2016 10:43
Зацикливание функции setTimeout MininAS Общие вопросы Javascript 19 14.10.2015 00:02
Передача контекста через setTimeout decadent jQuery 3 10.02.2011 19:01
setTimeout в браузере IE и Opera leha66 Javascript под браузер 2 13.12.2010 13:02