【问题标题】:As user calls APIs, build array of observables, and execute block when all resolve当用户调用 API 时,构建 observables 数组,并在所有解析时执行块
【发布时间】:2020-05-19 14:59:55
【问题描述】:

我想在用户与页面交互时构建一个可观察对象列表。每个 observable 都是单独订阅的,但我希望在进行单个或多个并发 API 调用后调用另一个函数。

我让每个函数都将一个 observable 推送到一个数组,并且我在我的 ngOnInit 中有一个 forkJoin 和对数组的订阅,但这只会触发一次。如何进行实时订阅,在所有当前 API 调用返回后执行回调函数,并在用户继续进行 API 调用时继续这样做?

例如,用户单击“创建事物”,然后什么也不做。

forkJoin(thingsInProgress).subscribe(() => doStuffWhenAllResolve())

...

createThing() {
    const = this.thingService.createThing().pipe(tap(() => doStuff()));
    thingsInProgress.push(createThing$);
    createThing$.subscribe();
}

deleteThing() {
    ...
}

updateThing() {
    ...
}

我想让doStuff() 开火,然后doStuffWhenAllResolve() 开火。或者,如果用户在几毫秒内依次单击“创建事物”、“删除事物”、“更新事物”,则 doStuff()(例如)被调用一次,doStuffWhenAllResolve() 被调用一次。

然后,如果用户真的很快又创建了 10 个东西,那么在所有重叠的 API 调用返回后,doStuffWhenAllResolve() 会再次被调用。

我在这里寻找什么 RXJS 运算符?

【问题讨论】:

    标签: angular typescript rxjs


    【解决方案1】:

    我会创建一个BehaviorSubject,其中createThing()deleteThing()updateThing() 分别发射并与debounceTime 耦合。

    类似这样的:

    actionMade$ = new BehaviourSubject(new Date());
    
    this.actionMade$.pipe(
      debounceTime(100), // Up to you to play with this 100, basically how long in ms does it have 
                         // to wait before accepting a new actionMade$
      switchMap(() => forkJoin(thingsInProgress)),
    ).subscribe(() => doStuffWhenAllResolve());
    
    createThing() {
      ...
      this.actionMade$.next(new Date());
    }
    
    deleteThing() {
      ...
      this.actionMade$.next(new Date());
    }
    
    updateThing() {
      ...
      this.actionMade$.next(new Date());
    }
    
    ngOnDestroy() {
      this.actionMade$.complete();
    }
    

    ================================================ ===== 请务必取消订阅(使用 sub.unsubscribe 或 takeUntil),否则它们会导致内存泄漏。

    【讨论】:

    • 感谢您的回复。让我看看我是否明白。所以,我正在创建一个可观察的日期,并在每个 .next() 之后等待 100 毫秒,看看是否有新的 .next() 进来?当时间过去了,订阅会触发吗?如果是这样,switchMap的作用是什么?那时我还需要一组 observables 吗?
    • 基本上 debounceTime 在 actionMade$ 的连续之间等待 100 毫秒。因此,如果用户点击deleteThing,然后在50ms 之后点击updateThing,则什么也没有,deleteThing 的发射被忽略,updateThing 的发射被接受。 SwitchMap 切换到不同的可观察对象(将其视为将齿轮转移到其他地方)。这样actionMade$ 就成为了主要的监听器,好吧我们去一个actionMade$ => 切换到这个数组的forkJoin(这样forkJoin 将永远是新鲜的)。
    猜你喜欢
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多