代码之家  ›  专栏  ›  技术社区  ›  gka

将流与RXJS(带交换机映射和Take)结合在一起

  •  0
  • gka  · 技术社区  · 7 年前

    我有两个流,来自键盘事件(k)和鼠标事件(m)。 当上一个事件为空或鼠标事件时,应生成键盘事件。 当上一个事件是键盘事件时,应生成鼠标事件。

    所以调度m-k-m-k-k-m-k-k,应该调用键盘处理程序3次,鼠标处理程序2次。

    以下订阅允许键盘流生成多个键盘事件,这不是我想要的。

    keyboardStream(document)
            .do(keyboardHandler)
            .switchMap(() => mouseStream(document).take(1))
            .subscribe(mouseHandler)
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   gka    7 年前

    我的结尾是:

    const keyboard$ = fromEvent(document, 'keyup')
    .pipe(
        mapTo('k')
    );
    
    const mouseOnce$ = fromEvent(document, 'keyup')
        .pipe(
            switchMap(() => fromEvent(document, 'mousedown').pipe(first())),
            mapTo('m')
        );
    
    const stream = merge(
        mouseOnce$,
        keyboard$
    ).pipe(distinctUntilChanged());