Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 如何知道工作何时完成_Angular_Rxjs_Reactive Programming - Fatal编程技术网

Angular 如何知道工作何时完成

Angular 如何知道工作何时完成,angular,rxjs,reactive-programming,Angular,Rxjs,Reactive Programming,我需要在“takeUntil”工作时执行最后一个操作,然后进一步发送数据,但我无法确切知道takeUntil何时完成工作。 谢谢大家 ngOnInit(): void { const thumb = document.getElementById("thumb"); const track: HTMLElement = document.getElementById("track"); const activeTrack = document.getElementBy

我需要在“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
        }
      });  
    }

takeUntil
在此之前完成源观测。这意味着我们可以利用完成<代码>重复再次启动已完成的观察。所以我们可以这样做:

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

takeUntil
在此之前完成源观测。这意味着我们可以利用完成<代码>重复再次启动已完成的观察。所以我们可以这样做:

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

所以基本上你需要在鼠标上做点什么?那么基本上你需要在鼠标上做点什么?