如何使用RxJS创建一个递增15分钟的时间范围?

时间:2019-07-05 02:46:32

标签: angular typescript rxjs

我正在尝试使用Moment.js对象与RxJS运算符创建一个时间数组。我认为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 :(得分:0)

我没有使用过generate(),但是问题可能出在moment对象是可变的,所以momentObject.add(...)会更改momentObject的事实。看到这里:https://momentjs.com/guides/#/lib-concepts/mutability/

您可以尝试: generate(startTime, time => time <= endTime, time => time.clone().add(15, 'minutes'))

答案 1 :(得分:0)

为什么需要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发出,一次发出一个值。