RxJS 合并 2 个订阅

Kra*_*itz 7 javascript rxjs ionic-framework ionic3 angular

我有一个输出 2 个可观察值的服务。1 用于仅获取当前经过身份验证的用户,另一个用于获取所有活动用户。在主屏幕上,我想调用这两个可观察量来使用,这将通过订阅这两个可观察量来完成(当前),但是第一个可观察量并不总是运行。我正在寻找一种解决方案,使两个可观察量在出现任何错误或在页面上加载之前发出值。我在下面的例子中尝试了 forkjoin 但它不起作用,我怀疑这是因为 forkjoin 期望发出一些东西但没有发出任何东西,但是订阅这两个可观察量确实输出了我需要的数据。这是我尝试过的:

    const tt =  Observable.forkJoin(
        this.auth.getActiveUsers().map((res) => res = res  ),
        this.auth.user.map((res) => res = res ),        
    );
    console.log("running" ); 
    tt.subscribe( (data) => {
      console.log("data ", data );      
        console.log("data[0] ", data[0] );
        console.log("data[1] ", data[1] );        
      },
      err => console.error(err),
      () => console.error("complete"),
    );  
Run Code Online (Sandbox Code Playgroud)

以下是订阅在我的 service.ts 文件中的布局方式:

    Filename: Service.ts

    ...

    // first Observable  
    constructor( private afAuth: AngularFireAuth,
                private db: AngularFirestore ) {

        this.user = this.afAuth.authState.switchMap(user => {
            if (user) {
                return this.db.doc<iUser>(`users/${user.uid}`).valueChanges()
            } else {
                return Observable.of(null)
            }
            })     

    }

    ...

    // second Observable
    getActiveUsers(): Observable<iUser[]> {
    return this.db.collection<iUser>('users').valueChanges().catch(this.catchError);                 
    }

    ...
Run Code Online (Sandbox Code Playgroud)

seb*_*ras 2

forkJoin需要一个数组,所以我认为这就是它在您的代码中不起作用的原因:

 const tt = Observable.forkJoin([
                this.auth.getActiveUsers(),
                this.auth.user
            ]);
 // ...
Run Code Online (Sandbox Code Playgroud)