我正在尝试使用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个矩对象组成的数组,它们的时间值都相同。
答案 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发出,一次发出一个值。