[rxjs] 怎么写一个流,让值来的时候,收集接下来一段时间的值然后发送。

2019-06-11 10:10:31 +08:00
 wly19960911
我现在需要一个逻辑,当 subject 发出值之后,收集接下来 100ms 内发出的值,筛选之后再发送出去,如果使用 bufferTime 我感觉容易出现性能问题。定时器跑的太欢了,如果使用 take 就变成了下次就没结果了。

我现在的实现特么用的是 睡眠排序,利用 delay 和 debounceTime 筛选出我最后要的结果。如果是正常的实现我想知道怎么做最好
1337 次点击
所在节点    问与答
4 条回复
wly19960911
2019-06-11 10:38:03 +08:00
其实我的场景是 筛选出事件冒泡中更为重要的事件,比如 select 组件,open 的时候需要点击 document (或者 backdrop )的时候关闭,问题是原有的组件逻辑里面没用 backdrop,这就可以操作其他的组件,如果这个时候如果为了阻止 document 的事件触发只能用过滤或者阻止事件冒泡。

因为原有组件逻辑问题我需要选择前者,但是过滤的时候我希望不是走过滤 document 而是收集所有被触发的事件来筛选更重要的事件....
wly19960911
2019-06-11 11:27:30 +08:00
结贴了,感觉我思路出问题了,这个过滤不应该交给中间的流来处理,我在 source 用局部变量控制下,过滤掉其他的事件就好...想法完全歪了
ookkxw
2019-06-11 11:33:09 +08:00
感觉你思路有问题吧,你这样设计把订阅方式变成了观察者方式,那还不如所有事件斗在一个队列里面处理,类似 react 盒合成事件
wly19960911
2019-06-11 11:42:16 +08:00
@ookkxw #3 嗯,想了下是思路的问题,我最后决定改成 filter 过滤,在执行不同事件的时候 tap 改变局部变量的值。这个时候就得开 filter 来过滤最重要的事件。

let eventActionType; // action type
merge(
fromEvent(A).pipe(
tap(() => eventActionType = A),
),
fromEvent(B).pipe(
filter(() => ....) // 根据 eventActionType 过滤
tap(() => eventActionType = B),
)
fromEvent(C).pipe(
filter(() => ....) // 根据 eventActionType 过滤
tap(() => eventActionType = C),
)
).pipe(
tap(() => eventActionType = null),
)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/572709

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX