Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.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 当用户调用API时,构建观察值数组,并在所有解析时执行块_Angular_Typescript_Rxjs - Fatal编程技术网

Angular 当用户调用API时,构建观察值数组,并在所有解析时执行块

Angular 当用户调用API时,构建观察值数组,并在所有解析时执行块,angular,typescript,rxjs,Angular,Typescript,Rxjs,我想在用户与页面交互时建立一个观察列表。每个observable都是单独订阅的,但我希望在进行单独或多个并发API调用后调用另一个函数 我让每个函数将一个可观测值推送到一个数组中,并且在我的ngOnInit中有一个forkJoin和对该数组的订阅,但这只触发一次。如何创建一个实时订阅,在所有当前API调用返回后执行回调函数,并在用户继续进行API调用时继续执行回调函数 例如,用户单击“创建东西”,然后什么也不做 forkJoin(thingsInProgress).subscribe(() =&

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

我让每个函数将一个可观测值推送到一个数组中,并且在我的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操作符?

我将创建一个
行为子对象
,其中
createThing()
deletThing()
,和
updateThing()
分别发出并与
去BounceTime
耦合

大概是这样的:

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()出现?当时间流逝时,将触发订阅?如果是这样,开关映射的功能是什么?在那一点上我还需要一组可观测数据吗?基本上,在连续的
actionMade$
之间,去BounceTime会等待100毫秒。因此,如果用户单击
deleteThing
,然后在
50ms
之后,单击
updateThing
,则什么都不做,来自
deleteithing
的发射被忽略,而
updateThing
的发射被接受。SwitchMap切换到不同的可观察对象(将其视为将档位切换到其他位置)。这样,
actionMade$
将成为主侦听器,好的,我们将actionMade$=>切换到此数组的forkJoin(这样forkJoin将始终是新的)。