Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.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
Javascript RxJS合并2个订阅_Javascript_Angular_Ionic Framework_Rxjs_Ionic3 - Fatal编程技术网

Javascript RxJS合并2个订阅

Javascript RxJS合并2个订阅,javascript,angular,ionic-framework,rxjs,ionic3,Javascript,Angular,Ionic Framework,Rxjs,Ionic3,我有一个输出2个可观测值的服务。1用于仅获取当前经过身份验证的用户,另一个用于获取所有活动用户。在主屏幕上,我想调用这两个可观察对象来使用,这将(当前)通过订阅这两个可观察对象来完成,但是第一个可观察对象并不总是运行。我正在寻找一种解决方案,使两个观察值在页面上出现任何错误或加载之前都发出一个值。我在下面的示例中尝试过forkjoin,但它不起作用,我怀疑这是因为forkjoin希望有东西发出,但没有东西发出,但订阅两个观察值确实会输出我需要的数据。以下是我尝试过的: const tt

我有一个输出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"),
    );  
下面是我的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);                 
    }

    ...
Filename:Service.ts
...
//首次观察到
构造函数(专用afAuth:AngularFireAuth,
私人数据库:AngularFirestore){
this.user=this.afAuth.authState.switchMap(用户=>{
如果(用户){
返回此.db.doc(`users/${user.uid}`)。valueChanges()
}否则{
可观测的返回值(空)
}
})     
}
...
//第二可观测
getActiveUsers():可观察{
返回此.db.collection('users').valueChanges().catch(this.catchError);
}
...

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

 const tt = Observable.forkJoin([
                this.auth.getActiveUsers(),
                this.auth.user
            ]);
 // ...

我猜您的
auth.user
可观察对象是一个热门对象(当值发出时不完整),而forkJoin仅当所有传递的可观察对象都已完成时才会发出。不发出值,但完成


如果我的猜测是正确的,那么在这种情况下,您可以做的就是传递
auth.user.first()
,它将从原始可观察对象创建一个完整的可观察对象,并且您的forkJoin将按预期工作

使用合并映射+forkJoin

import { mergeMap } from 'rxjs/operators';
import { forkJoin, of } from 'rxjs';

const myPromise = val =>
  new Promise(resolve =>
    setTimeout(() => resolve(`Promise Resolved: ${val}`), 5000)
  );

const source = of([1, 2, 3, 4, 5]);
const example = source.pipe(mergeMap(q => forkJoin(...q.map(myPromise))));
/*
  output:
  [
   "Promise Resolved: 1",
   "Promise Resolved: 2",
   "Promise Resolved: 3",
   "Promise Resolved: 4",
   "Promise Resolved: 5"
  ]
*/
const subscribe = example.subscribe(val => console.log(val));

Rxjs6+
您可以直接使用
从'rxjs'导入{forkJoin},,