V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
wly19960911
V2EX  ›  问与答

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

  •  
  •   wly19960911 · 2019-06-11 10:10:31 +08:00 · 1325 次点击
    这是一个创建于 1775 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我现在需要一个逻辑,当 subject 发出值之后,收集接下来 100ms 内发出的值,筛选之后再发送出去,如果使用 bufferTime 我感觉容易出现性能问题。定时器跑的太欢了,如果使用 take 就变成了下次就没结果了。

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

    因为原有组件逻辑问题我需要选择前者,但是过滤的时候我希望不是走过滤 document 而是收集所有被触发的事件来筛选更重要的事件....
    wly19960911
        2
    wly19960911  
    OP
       2019-06-11 11:27:30 +08:00
    结贴了,感觉我思路出问题了,这个过滤不应该交给中间的流来处理,我在 source 用局部变量控制下,过滤掉其他的事件就好...想法完全歪了
    ookkxw
        3
    ookkxw  
       2019-06-11 11:33:09 +08:00 via iPhone
    感觉你思路有问题吧,你这样设计把订阅方式变成了观察者方式,那还不如所有事件斗在一个队列里面处理,类似 react 盒合成事件
    wly19960911
        4
    wly19960911  
    OP
       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),
    )
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2960 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 03:07 · PVG 11:07 · LAX 20:07 · JFK 23:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.