在函数失步

时间:2017-12-07 19:46:52

标签: angular typescript firebase firebase-realtime-database angularfire2

我想从RealTime数据库获取评论。我确实完成了任务,但只有在返回页面后才会显示对象(不刷新)。

blog.service.ts中的默认angularfire2 constuctor

constructor(public afDb: AngularFireDatabase) {}

我的功能是从DB中获取评论。这只是众多函数中的一个,我不知道如何在一个过程中获取引用或对象,我想出了这样的函数。

getComments(blogTitle: string) {
    const blogsRef = this.afDb.database.ref('blog-pl');
    let commentsRef = null;
    blogsRef.orderByChild('title').equalTo(blogTitle).on("child_added", function (snapshot) {
      if (snapshot.hasChild('comments')) {
        commentsRef = snapshot.child('comments').ref;
      }
    });
    return this.afDb.list<Comment>(commentsRef, ref =>
      ref.orderByChild('timestamp')
    ).valueChanges();
  }

当然我想得到Observable Comment [],但我得到null。问题是评论不能进入

this.afDb.list<Comment>(commentsRef,...

返回值之前。我试过在函数中返回它,我在其中指定了对commentsRef的引用。但它呼吁 错误:(56,9)TS2347:无类型函数调用可能不接受类型参数。 我无法解决这个问题。

尝试在comments.component.ts

中获取它
public currentComments: Observable<Comment[]>;

constructor(private blogService: BlogService, private authServicec: AuthService) {}

ngOnInit(): void {
    this.currentComments = this.blogService.getComments(this.blogTitle);
    this.currentComments.subscribe(val => {
      if (val.length != 0) {
        this.areAnyComms = true;
      }})
  }

使用

在html中显示它
<ul *ngFor="let curUserReview of (currentUsersReviews | async)?.slice().reverse()">

等待您的建议并感谢您的回答。

1 个答案:

答案 0 :(得分:0)

你应该把它放在第一次获取中,因为数据是异步的。尝试

getComments(blogTitle: string) {
const blogsRef = this.afDb.database.ref('blog-pl');
let commentsRef = null;
return blogsRef.orderByChild('title').equalTo(blogTitle).on("child_added", function (snapshot) {
  if (snapshot.hasChild('comments')) {
    commentsRef = snapshot.child('comments').ref;
    return this.afDb.list<Comment>(commentsRef, ref =>
      ref.orderByChild('timestamp')
    ).valueChanges();
  }
});
}