Angular forkJoin 订阅未触发

标签 angular rxjs observable

我有几种形式的方法

    getFirstDataBunch() {
        return this.repository.getData(this.parameter).pipe(
            switchMap(
                result => {
                    //Do something with result;
                    return of(true);
                }
            )
        );
    }

然后我将我的 ngOnInit 调用为:

    function ngOnInit(){
        forkJoin(this.getFirstDataBunch(), this.getSecondDataBunch(), this.getThirdDataBunch()).subscribe(
            results => {
                //do stuff with results; 
            }
        );
    }

我可以看到所有的可观察对象都被调用,并且它们返回一个可观察对象,但是从我读到的forkJoin来看,forkJoin Subscribe 方法从未被调用仅当所有可观察对象返回并完成时才会触发,我确实相信情况如此,那么为什么不触发呢?

我还发现有些人只是选择 combineLatest,但因为这些方法仅返回一次,所以我实际上不需要继续寻找它们的更新。

最佳答案

我只需使用您想要/需要的组合运算符,并使用 take(1) 对其进行管道传输。

为什么使用 take() 运算符?

因为take返回一个Observable,它仅发出源Observable发出的前X个值。我们设定了多少排放量。

示例:

import { of } from 'rxjs';
import { take } from 'rxjs/operators';

//emit 1,2,3,4,5
const source = of(1, 2, 3, 4, 5);
//take the first emitted value then complete
const example = source.pipe(take(1));
//output: 1
const subscribe = example.subscribe(console.log);

//output: 1, 2, 3
const example2 = source.pipe(take(3)).subscribe(console.log);

如果你想 100% 确定避免任何可能的内存泄漏,我建议也使用 takeUntil() (因为 take(1) 可能会由于某种原因永远卡住,如果可观察的永远不会发射)

.pipe(take(1), takeUntil(this.destroy$))

作为一般建议,始终将 takeUntil() 作为管道的最后一个参数。

关于什么组合运算符:

forkJoin --> 正如您所写,等待所有可观察对象完成,然后从每个可观察对象中发出最后发出的值(如 Promise.all)。它可以工作,但是每个可观察的对象都需要完成(而不仅仅是发出!)。

zip --> 等待所有可观察值发出,然后将值作为数组发出(按顺序 - 下图)。我可能会用这个。

combineLatest --> 等待所有可观察对象发出,发出一次。然后,每当任何输入 Observable 发出一个值时,它都会发出发出的 Observable 的新值以及其他 Observable(未发出的)的最后一次发出的值。当然,这也适用于 take(1)...

zip example

关于Angular forkJoin 订阅未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65800019/

相关文章:

javascript - 是否可以使用 SCSS 将一个元素的 margin-top 设置为另一个元素高度的 60%?

angular - 如何对这个 Angular typescript Http Error Interceptor 进行单元测试,该拦截器从管道 observable 中捕获错误?

javascript - SwitchMap 在 Angular 中无法正常工作

http - Angular2 可观察的

reactive-programming - RxJs Observable 无限滚动或如何组合 Observables

与 Kotlin、BaseObservable 和自定义委托(delegate)的 Android 数据绑定(bind)

angular - 无法连接到运行时进程,10000 毫秒后超时 - (原因 : Cannot connect to the target: connect ECONNREFUSED 127. 0.0.1:9229)

javascript - 如何反转 *ngFor 中的顺序?

javascript - Angular2 : AsyncPipe and Observable, 无法检索属性(TypeError : Cannot read property . .. of null)

angular - 如何在 Angular 2 中创建单例服务?