首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RxJS Combine 2订阅

RxJS Combine 2订阅
EN

Stack Overflow用户
提问于 2018-01-18 01:07:23
回答 3查看 6.4K关注 0票数 5

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

代码语言:javascript
复制
    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文件中的布局:

代码语言:javascript
复制
    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);                 
    }

    ...
EN

回答 3

Stack Overflow用户

发布于 2018-01-18 04:37:10

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

代码语言:javascript
复制
 const tt = Observable.forkJoin([
                this.auth.getActiveUsers(),
                this.auth.user
            ]);
 // ...
票数 1
EN

Stack Overflow用户

发布于 2018-01-18 07:19:55

我猜您的auth.user可观察对象是一个热门对象(值发出时不是完全的),而forkJoin只有在所有传递的可观察对象都为时才会发出。不是发送值,而是完成。

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

票数 1
EN

Stack Overflow用户

发布于 2020-05-08 03:08:42

使用mergeMap + forkJoin

代码语言:javascript
复制
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));

Full example

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48306458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档