setTimeout с объектом Date - PullRequest
       6

setTimeout с объектом Date

0 голосов
/ 31 августа 2018

Я создаю тайм-аут на основе ввода пользователя с форматом ввода: 1min или 2h и решаю, является ли это минутой или часом, с помощью следующего кода:

if (duration.includes("h", 1)) {
  /* If the collectedDuration includes "h" in it,
  parse the string into an integer and multiply it with an hour in miliseconds */
  const intDuration = parseInt(duration, 10);
  const parsedDuration = intDuration * 3600000;
  // Create the timer with setTimeout where parsedDuration is the delay
  createTimer(item, parsedDuration);
} else if (duration.includes("m", 1)) {
  const intDuration = parseInt(duration, 10);
  const parsedDuration = intDuration * 60000;
  createTimer(item, parsedDuration);
}

Что я хочу сделать: выяснить, сколько времени осталось до завершения setTimeout в любой момент времени, прежде чем это произойдет. Например: Таймер создается на 1 час и 15 минут спустя, я использую команду для отображения оставшегося времени, которое будет 45 минут.

Я попробовал метод преобразования, найденный здесь , но это статично; он только конвертирует базовые милисекунды в часы. Мне нужно что-то динамическое.

Я также пытался сделать это с объектами Date, но не получилось. Как я могу продолжать об этом?

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Этот ответ неполон, скорее предложение.

Вы сказали, что вам не удалось сделать то, что вам нужно, с помощью объекта Date, подумайте, что этот метод использовал с помощью библиотеки momentjs. Момент значительно упрощает изменение даты, чем преобразование в эпоху и добавление / вычитание мс.

https://momentjs.com/

Вы можете делать такие вещи, как:

 var x = moment(); // sets x to now
 x.subtract(10, 'minute'); // subtracts 10 minutes
 console.log(x.format('MMMM Do YYYY, h:mm:ss a')); // see what you have now
0 голосов
/ 31 августа 2018

Вы не можете сделать это с ванилью setTimeout. Вам придется обернуть его:

class Timeout {
  // this is a pretty thin wrapper over setTimeout
  constructor (f, n, ...args) {
    this._start = Date.now() + n; // when it will start
    this._handle = setTimeout(f, n, ...args);
  }

  // easy cancel
  cancel () {
    clearTimeout(this._handle);
  }

  // projected start time - current time
  get timeLeft () {
    return this._start - Date.now();
  }
}

Хотелось бы, чтобы они изначально предоставили интерфейс OO для тайм-аутов / интервалов. Использование:

const timeout = new Timeout(console.log, 2000, 'foo', 'bar');
setTimeout(() => console.log(timeout.timeLeft), 1000);

должен напечатать что-то вроде

1000
foo bar

В течение пары секунд.

...