JavaScript: назначение переменной, если переменная изменена - PullRequest
0 голосов
/ 21 сентября 2019

In JAVASCRIPT :

Если у меня есть переменная, значение которой постоянно меняется (100+ раз в секунду).Как мне «записать» определенное значение в определенный момент времени?В дополнение к этому, как я могу основать этот момент времени на другой переменной, значение которой изменилось?

Это должно быть строго в JavaScript.Я посмотрел на метод onChange (), но я не уверен, должен ли я использовать это в сочетании с HTML для его работы.Если нет, то может ли кто-нибудь дать мне пример, где это не так?

Приветствия

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

Я не на 100% уверен в том, что вы пытаетесь сделать, но, как говорит Ранджит , вы можете использовать setTimeout для запуска произвольного кода в какое-то (приблизительное) будущее время.

Этот пример, вероятно, можно улучшить, если бы у меня было немного больше подробностей о том, что вы делаете.

Если вы находитесь в среде узлов, вы можете рассмотреть возможность использования события .эмиттер для широковещательной передачи изменений вместо необходимости иметь переменную в области видимости.(Это не особенно сложно сделать в браузере, если вы находитесь там.)

html / css-части предназначены только для отображения значений в примере;иначе не нужно.

const rand = document.getElementById('rand');
const snapshot = document.getElementById('snapshot');

let volatile = 0;

// update the value every ~100ms
setInterval(() => {
  // assign a new random value
  volatile = Math.random();

  // display it so we can see what's going on
  rand.innerText = volatile;
}, 100);

// do whatever you want with the snapshotted value here
const snap = () => snapshot.innerText = volatile;

// grab the value every 2 seconds
setInterval(snap, 2000);
div {
  margin: 2rem;
}
<div>
  <div id="rand"></div>
  <div id="snapshot"></div>
</div>
0 голосов
/ 21 сентября 2019

Хорошо - хорошо, вы можете опросить изменения переменных ... даже если вы можете использовать сеттеры ...

Позволяет сравнить:

Опрос:

let previous;
let watched = 0;
let changes = 0;
let snap = () => previous = watched !== previous && ++changes && watched || previous;
let polling = setInterval(snap, 100);

let delta = 1000 * 2
let start = Date.now();
let last = start;
let now;
let dt = 0
while(start + delta > Date.now()){
   now = Date.now();
   dt += now - last;
   last = now;
   if(dt > 100){
      watched++;
      dt = 0;
   }
} 
document.getElementsByTagName('h1')[0].innerText = (changes === 0 ? 0 : 100 * watched / changes) + "% hit" 
if(watched - changes === watched){
  throw Error("polling missed 100%");
}
<h1><h1>

испуская:

const dataChangeEvent = new Event("mutate");
const dataAccessEvent = new Event("access");
// set mock context - as it is needed
let ctx = document.createElement('span');

// add watchable variable
add('watched', 0);

//listen for changes
let changes = 0;
ctx.addEventListener('mutate', () => changes++);

let delta = 1000 * 2
let start = Date.now();
let last = start;
let now;
let dt = 0
while(start + delta > Date.now()){
   now = Date.now();
   dt += now - last;
   last = now;
   if(dt > 100){
      ctx.watched++;
      dt = 0;
   }
} 

document.getElementsByTagName('h1')[0].innerText = (changes === 0 ? 0 : 100 * ctx.watched / changes) + "% hit" 
if(ctx.watched - changes === ctx.watched){
  throw Error("trigger missed 100%");
}


function add(name, value){
  let store = value
  Object.defineProperty(ctx, name, {
    get(){
      ctx.dispatchEvent(dataAccessEvent, store)
      return store;
    },
    set(value){
      ctx.dispatchEvent(dataChangeEvent, {
        newVal: value,
        oldVal: store,
        stamp: Date.now()
      });
      store = value;
    }
  })
}
<h1></h1>

Использование цикла while специально.

...