【问题标题】:How to know when finished working takeUntil如何知道何时完成工作 takeUntil
【发布时间】:2020-04-16 16:32:28
【问题描述】:

我需要在“takeUntil”工作时执行最后一个操作,然后进一步发送该数据,但我无法确切知道 takeUntil 何时完成工作。 谢谢大家。

  ngOnInit(): void {
    const thumb = document.getElementById("thumb");
    const track: HTMLElement = document.getElementById("track");
    const activeTrack = document.getElementById("active-track");
    const mouseUp = fromEvent(document, "mouseup");

    const mouseMove = fromEvent(document, "mousemove").pipe(
      map((item) => this.mouseEventToCoordinate(item, track))
    );
    const activeTrackClick = fromEvent(activeTrack, "click").pipe(
      map((item) => this.mouseEventToCoordinate(item, track))
    );
    const trackClick = fromEvent(track, "click").pipe(
      map((item) => this.mouseEventToCoordinate(item, track))
    );
    const mouseDown = fromEvent(thumb, "mousedown");

    mouseDown
      .pipe(
        switchMap(() => mouseMove),
        merge(trackClick, activeTrackClick),
        takeUntil(mouseUp),
        repeat()
      )
      .subscribe((item: { trackWidth: number; position: number }) => {
        const newX = (item.position / item.trackWidth) * 100;
        activeTrack.style.width = (newX + 1).toString() + "%";
        thumb.style.left = newX.toString() + "%";

        if (item === "Done") {
          // Do somethings
        }
      });  
    }

【问题讨论】:

  • 所以基本上你需要在 mouseup 上做点什么?

标签: angular rxjs reactive-programming


【解决方案1】:

takeUntil 在此之前完成源 Observable。这意味着我们可以利用完成。 repeat 再次启动完成的 Observable。所以我们可以这样做:

mouseDown
  .pipe(
    switchMap(() => mouseMove),
    merge(trackClick, activeTrackClick),
    takeUntil(mouseUp),
    tap({ complete: () => doSomething() }), // This will execute when mouseUp emits and takeUntil completes source Observable
    repeat(),
  )
...

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 2012-01-13
    • 2016-04-21
    • 2019-07-05
    • 2018-01-16
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    相关资源
    最近更新 更多