首页 > 解决方案 > 这是在 angularfire2 中使用 rxjs MergeMap 的正确方法吗?

问题描述

我是 angular 和 rxjs 的新手,我试图通过firebase使用angularfire2and获得三个不同的值rxjs,并将其作为承诺返回。经过多次研究和尝试,我终于通过使用此代码实现了它。

这是代码(假设 afdb 是 angularfire-database):

getThreeValues() {
    return this.afdb.list('firebaseref1').valueChanges().pipe(
        map(data => {
            return data.length;
        }),

        mergeMap(first => {
            return this.afdb.object('firebaseref2').valueChanges().pipe(
                map(second => {
                    return ({first: first, second: second})
                }),
                take(1)
            );
        }),

        mergeMap(firstsecond => {
            return this.afdb.list('firebaseref3').valueChanges().pipe(
                map(third => {
                    return ({...firstsecond, third: third})
                }),
                take(1)
            );
        }),

        take(1))
        .toPromise();
}

代码有效,我得到了承诺,它解析为包含我需要的三个值的对象。

问题是我不确定这是否是最好的方法(因为我不确定这段代码是如何工作的)。

标签: angulartypescriptrxjsangularfire2

解决方案


因为你很确定你只会取你的第一个值,所以将它们包装成 a而不是它们.valueChanges()会更有效。在 from javascript 的帮助下,您的代码看起来会更简单,如下所示:.forkJoin().mergeMappingdestructuring

getThreeValues() {
    return forkJoin(
        this.afdb.list('firebaseref1').valueChanges().pipe(take(1)),
        this.afdb.object('firebaseref2').valueChanges().pipe(take(1)),
        this.afdb.object('firebaseref3').valueChanges().pipe(take(1))
    )
        .pipe(
            map(([first, second, third]) => ({
                first: first.length,
                second,
                third
            }))
        ).toPromise()
}

推荐阅读