Почему setInterval () не возвращает возвращаемое значение моей функции?

1

Я очень новичок в кодировании (2 недели опыта), поэтому, пожалуйста, расскажите о моем глупом вопросе об этом коде. В конечном итоге я хочу, чтобы он постоянно запускал функцию под названием "таймер", которая говорит мне, сколько времени потребовалось для запуска функции "добавить", отобразить этот результат на моем экране и затем обновлять результаты при каждом запуске.

function add(a,b){ 
  return a + b;
}

function timer(){
  var a = Math.floor(Math.random() * 101);
  var b = Math.floor(Math.random() * 101);
  var start = performance.now();
  add();
  var end = performance.now();
  var duration = end - start;
  return duration + ' milliseconds';
}

t = setInterval(timer,1000);

Кажется, что это должно возвращать число "1" и ничего не делать после.

Теперь, когда я заменяю

return duration + ' milliseconds' 

с

console.log(duration + ' milliseconds') 

он делает то, что я хочу, за исключением того, что причина, по которой я не хочу использовать console.log, заключается в том, что она перескакивает на новую строку при отображении продолжительности вместо замены предыдущей строки на новую длительность. Чтобы уточнить, я не хочу, чтобы большой список продолжительности, который увеличивается дольше, каждый раз, когда он запускается, я показываю только одну продолжительность, которая обновляется и заменяется каждый раз, когда она запускается.

Спасибо за помощь!

  • 0
    setInterVal() возвращает timeoutID который представляет собой «числовое, ненулевое значение» developer.mozilla.org/en-US/docs/Web/API/…
Теги:
setinterval

5 ответов

0
Лучший ответ

Функция console.log добавляется к консоли. Поэтому вам нужно очистить консоль, чтобы достичь того, чего вы хотите.

Если вы находитесь на хроме, то вызовите

clear() 

перед console.log() в функции таймера.

Надеюсь, поможет

  • 0
    Здесь было много хороших решений (спасибо всем!), Но это было так просто, я заработал его ровно за 2 миллисекунды;)
2

setInterval является асинхронным, поэтому вы не получите возвращаемое значение таким образом. Номер, который вы возвращаете, - это идентификатор для более позднего, когда вы хотите clearInterval.

Но позвольте сказать, весело setInterval было попытаться вернуть значение.

Вы делаете t = setInterval(...) но когда это происходит, ваш код внутри setInterval еще не выполнен. Он был просто помещен в очередь в тот момент, но назначение t =... не ждет.

возможно, это может помочь https://code.tutsplus.com/tutorials/event-based-programming-what-async-has-over-sync--net-30027

0

Если вы хотите получать уведомления, когда setInterval завершен, вам может потребоваться использовать обещание:

function add(a,b) { 
  return a + b;
}

function timer(delayTime) {
  return new Promise(
    function(resolve) {
      setInterval(
        function() {
          var a = Math.floor(Math.random() * 101);
          var b = Math.floor(Math.random() * 101);
          var start = performance.now();
          add();
          var end = performance.now();
          var duration = end - start;
          resolve(duration + ' milliseconds');
        }, delayTime
      );
    }
  );
}

timer(1000).then(
  function(t) {
    console.log(t);
  }
);
0

Когда ты сказал

отобразить этот результат на моем экране

Я думаю, вы просто хотите обновить текст элемента. Если вы просто хотите отслеживать это, вам нужно будет использовать переменную вне функции таймера и обновить эту переменную внутри функции. Как указывали другие, setInterval вернет идентификатор для получения интервала позже. Например, если вы хотите остановить таймер, вы должны сделать clearInterval(t);

Я создал фрагмент кода, который каждый раз обновляет продолжительность на экране:

function add(a,b){ 
  return a + b;
}

function timer(){
  var a = Math.floor(Math.random() * 101);
  var b = Math.floor(Math.random() * 101);
  var start = performance.now();
  add();
  var end = performance.now();
  var duration = end - start;
  document.getElementById('duration').innerHTML = duration + ' milliseconds';
}

t = setInterval(timer,1000);
Duration: <span id="duration"></span>

Кроме того, взгляните на это, поскольку вы новичок в кодировании: как вернуть ответ от асинхронного вызова?

0

Вы устанавливаете t на возвращаемое значение setInterval()

В документации указано, что setInterval() возвращает следующее:

timeoutID... числовое, ненулевое значение, которое идентифицирует таймер

Кажется, что вы действительно хотите установить переменную t где-то внутри timer(), так что, когда setInterval() вызывает ее каждые 1000 мс, она обновит t.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню