Каждые 2 секунды приходит json-ответ от сервера. Как подвесить событие на изменение значения?

185
16 сентября 2018, 15:20

У меня два вопроса, связанные между собой: 1) Есть ли специальные события, которые реагируют на изменение значения переменной? 2) К примеру есть следующий код:

if(xhr.status == 200){
    let jsonic = JSON.parse(xhr.responseText)
}

Как можно сравнить одну и ту же переменную jsonic с разницей в 2 секунды?

Answer 1

1) Есть ли специальные события, которые реагируют на изменение значения переменной?

Специального события нет, но вы можете написать функции getter/setter. В setter которых будет либо генерироваться событие, либо выполняться нужный код. Это сильно улучшит архитектуру, если таких переменных станет больше.

var jsonic = { 
  _val: 0, 
  set value(val) { 
    this._val = val; 
      
     // Выполняем нужный код. Опционально можно генерировать событие, зависит от закладываемой архитектуры взаимодействия 
     alert( val ); 
  }, 
  get value() { 
    return this._val; 
  } 
}; 
 
jsonic.value = 123; 
console.log( jsonic.value );

Если необходимо что-то делать только при изменении значения, можно немного модифицировать код:

var jsonic = { 
  _val: 0,  
  set value(val) { 
    if( this._val == val ) { 
      return false; 
    }; 
    this._val = val; 
 
     // Выполняем нужный код. Опционально можно генерировать событие, зависит от закладываемой архитектуры взаимодействия 
     alert( val ); 
  }, 
  get value() { 
    return this._val; 
  } 
}; 
 
jsonic.value = 123; 
console.log( jsonic.value ); 
 
// Второго alert не будет 
jsonic.value = 123;

Answer 2
var oldJsonicText;
var jsonicText;
setInterval(function() {
  if (oldJsonicText != jsonicText) {
    ...
    oldJsonicText = jsonicText;
  }
}, 2000);
if(xhr.status == 200){
    if (jsonicText != xhr.responseText) {
      ...
      jsonicText = xhr.responseText;
    }
    let jsonic = JSON.parse(xhr.responseText);
}
READ ALSO
Delete elements from array by .splice()

Delete elements from array by .splice()

Как я могу удалить элемент вложенного массива? Типа: array[i][j], где j - удаляемый элемент

227
Не работает gulp watch

Не работает gulp watch

Не запускается таск watch, сервер стартует, а после него ничегоВ чем проблема и как исправить?

212
Не работают плагины jquery при подключении через webpack. Как правильно настроить?

Не работают плагины jquery при подключении через webpack. Как правильно настроить?

Пытаюсь настроить окружение для работы с webpackМодули npm загружены, там есть jquery и первый плагин - YTPlayer

182
Вывод значений Jinja2

Вывод значений Jinja2

Хочу вывести на страницы данный в таком формате: [{'group_name': <>, 'date': [<>,<>,

199