Как я могу создать диапазон времени, увеличенный на пятнадцать минут с RxJS? - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь создать массив раз с операторами RxJS, используя объекты Moment.js.Я думаю, что оператор generate() хорошо подойдет, но он возвращает одно и то же время снова и снова, а не увеличенное время.Что я делаю не так?

Согласно документам,

https://rxjs -dev.firebaseapp.com / api / index / function / generate

Я должен иметь возможность использовать generate(startingValue, condition, increment) для создания наблюдаемой, которую я могу затем направить или подписаться, но я не могу заставить это работать.


times(): void {
        const startTime: Moment = START.clone(); //2019-01-01T16:00:00.000
        const endTime: Moment = END;             //2019-01-01T21:00:00.000
        generate(startTime, time => time <= endTime, time => time.add(15, 'minutes')).pipe(
           toArray()
        ).subscribe(console.log);
}

// returns: [2019-01-01T16:00:00.000, 2019-01-01T16:00:00.000...] 20 times
// desired: [2019-01-01T16:00:00.000, 2019-01-01T16:15:00.000, 2019-01-01T16:30:00.000... ]

Я просто получаю массивиз 20 объектов момента, все с одинаковым значением времени.

Ответы [ 2 ]

0 голосов
/ 05 июля 2019

Зачем вам нужны RxJ для создания массива? Почему бы просто не использовать Array.from? RxJs создает потоки, а не массивы.

const createDateRange = (start, end, intervalQuantity, intervalType) => {
  const duration = moment.duration(end.diff(start));
  const interval = moment.duration(intervalQuantity, intervalType);
  return Array.from(
    { length: (duration.asHours() / interval.asHours()) + 1 },
    (_, i) => start.clone().add(moment.duration(intervalQuantity * i, intervalType))
  );
};

console.log(
  createDateRange(
    moment('2019-01-01T16:00:00.000'),
    moment('2019-01-01T21:00:00.000'),
    15,
    'minutes'
  )
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

Если вы хотите, чтобы наблюдаемое было доступно, вы можете обернуть массив параметром of, чтобы выдать весь массив, или from, чтобы выдавать значения по одному за раз.

0 голосов
/ 05 июля 2019

Я не использовал generate(), но, возможно, проблема в том, что объект moment изменчив, так что momentObject.add(...) изменяет momentObject. Смотрите здесь: https://momentjs.com/guides/#/lib-concepts/mutability/

Вы можете попробовать: generate(startTime, time => time <= endTime, time => time.clone().add(15, 'minutes'))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...