简体   繁体   English

forkJoined可观察对象未在组件中呈现输出

[英]forkJoined observables not rendering output in the component

All of my posts data is located at /posts 我所有的帖子数据都位于/posts

When uploading new posts - postId's are also saved in /people/${userId}/posts 上传新帖子时-postId也会保存在/people/${userId}/posts

Have a getFeed(uri, fetchPostDetails = false) 有一个getFeed(uri, fetchPostDetails = false)

When getting All Posts feed (general feed page) it uses uri posts & false for the fetchPostDetails and retrieves bc all of the post data is there. 获取“所有帖子”供稿(常规供稿页面)时,它将uri posts和false用作fetchPostDetails,并在其中检索所有的帖子数据。

Problem When retrieving user posts and post data it will go to get user's postsId's and then get that post data individually. 问题检索用户帖子和帖子数据时,它将获取用户的postsId,然后分别获取该帖子数据。 So it creates multiple observables's and returns a forkJoined Observable to render in the Component. 因此,它将创建多个可观察对象,并返回forkJoined Observable以便在Component中进行渲染。 Can't get it to render. 无法渲染。

// located angularFireHelper  service 

getUserFeed(uri, fetchPostDetails = true) {
    let query = null;
    query = this.database.list(`/${uri}`,
        {
            query: {
                orderByKey: true,
            }
        });


    // IF not general feed fetchPostDetails
    if (fetchPostDetails) {
        return query.map((posts) => {
            console.log('User page so fetchPostDetails called');

            let source = [];
            source = posts.map(post => {
                // returns an Observable
                return this.database.object(`/posts/${post.$key}`);
            });

            return Observable.forkJoin(source);
        });
}


// userFeed.component.ts
ngOnInit() {
    this.componentName = 'user page component';
    this.user = this.afAuth.authState;
    this.getUsersFeedPosts();
}


getUsersFeedPosts() {
    this.user.subscribe(
        (value) => {
            console.log('value', value.uid);
            this.currentUser = value;
            this.afHelperService.getUserFeed(`people/${this.currentUser.uid/posts`).subscribe(
                (posts) => {
                        console.log('posts', posts);
                        this.userPosts = posts;
                    });
}


// userFeed.component.html
{{ userPosts | json }}


// In the console for posts (userPosts) it shows 

posts ForkJoinObservable {_isScalar: false, sources: Array(4), resultSelector: null}
enter code here
sources: (4) [FirebaseObjectObservable, FirebaseObjectObservable, FirebaseObjectObservable, FirebaseObjectObservable]

UPDATE Changing the angularFireHelperService code to the following worked. 更新将angularFireHelperService代码更改为以下工作。 Not 100% sure why this is the only way I could get it to work. 并非100%知道为什么这是我可以使其正常工作的唯一方法。 Seems like an antipattern using zip operator. 好像是使用zip运算符的反模式。

if (fetchPostDetails) {
    return query.switchMap((posts) => {
        console.log('User page so fetchPostDetails called');

        let source = [];
        source = posts.map(post => {
            // returns an Observable
            return this.database.object(`/posts/${post.$key}`);
        });

            return Observable.zip(...source);
    });

You sould extend your stream using switchMap. 您可以使用switchMap扩展流。 Change to query.switchMap 更改为query.switchMap

if (fetchPostDetails) {
        return query.switchMap((posts) => {
            console.log('User page so fetchPostDetails called');
            let source = [];
            source = posts.map(post => {
                // returns an Observable
                return this.database.object(`/posts/${post.$key}`);
            });
            return Observable.forkJoin(source);
 });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM