【发布时间】:2020-04-01 16:26:16
【问题描述】:
我有无限的事件流,可以发出一些连续的事件部分,我想每毫秒每 1000 个事件发生一个。
我尝试了debounceTime/auditTime/throttleTime,但它们不包括我想要的所有事件 - 以演示我创建的行为 playground on stackblitz,它在 10 个事件的一部分中每 300 毫秒触发一次事件:
debounceTime(1000)将只给出事件#10throttleTime(1000)将给出事件1,5,9但它会省略 #10这是必不可少的auditTime(1000)将提供事件4,8
我在这里想要的是获取事件1,5,9,10(每 1000 毫秒间隔一个事件)。我如何做到这一点?
const events$ = interval(300).pipe(
map(num => `Firing event ${num + 1}`)
);
const source = events$.pipe(
tap(console.log),
take(10),
// make some debouncing??
map(x => `Received ${x}!`)
);
source.subscribe(x =>
console.log(
"%c" + x,
"background: purple; color: white; padding: 3px 5px; border-radius: 3px;"
)
);
我还尝试使用zip / combineLatest 并通过间隔but no luck with that 发出值
【问题讨论】:
-
你能解释一下最后一个是什么意思吗?你想在 1000ms 和最后一个已知值之后得到它的当前值吗?所以这将是 1 的历史链,对吗?
-
我想每 1000 毫秒发出不超过 1 个事件,油门现在将省略 #10,因为它在 #9 之后太快了 - 我希望它触发 #10 作为它最后的唯一事件1000ms 间隔
-
那应该怎么带10? 1 默认为输入,2/300 输出,3/600 输出,4/900 输出,5/1200 输入,6/300 输出,7/600 输出,8/900 输出,9/1200 输入,10/300 -出去。或者你想算作1/0进、2/300出、3/600出、4/900出、/1000复位、5/200进、6/500出、7/800出、1000/复位、8/100 进、9/400 出、10/700 出……也不行。
-
如果你想要 10 个只是因为它是第 10 个并且你期望 10 个组发射 - 请告诉我。
-
好的,明白了你的意思,我不希望正好有 10 个 - 我希望有一组事件,如果限制它们,我可能会丢失最后一个重要的事件。因此,如果在当前 1000 毫秒间隔内的最新事件之后没有更多事件发生 - 它应该被流式传输。我考虑过通过
merge(events$.throttleTime(1000), events$.debounceTime(1000)组合流,但我不确定这会涵盖所有情况