【问题标题】:Angular Firebase not fetching realtime results, console.log says undefinedAngular Firebase 未获取实时结果,console.log 显示未定义
【发布时间】:2020-05-05 15:46:09
【问题描述】:

我无法从 Cloud Firestore 获取实时数据。如果我执行 console.log 而不是在服务中返回并简单地调用该函数(不订阅它)它就可以工作。

这是我的聊天服务文件中的代码

    getRealTimeChats(): any {
    this.db.collection('chats').onSnapshot(querySnapshot => {
      const chat: ChatModel[] = [];
      querySnapshot.forEach(doc => {
        const data = doc.data() as ChatModel;
        chat.push(data);
      });
      return chat;
    });
}

下面是我的chat.ts文件中的代码

this.chatService.getRealTimeChats().subscribe((chats: ChatModel[]) => {
      this.chats = chats;
});

【问题讨论】:

  • 你的 getRealTimeChats 函数实际上并没有返回一个 observable。它实际上根本没有返回任何东西。 onSnapshot 回调中的 return 语句没有达到你的预期。

标签: angular firebase google-cloud-firestore observable


【解决方案1】:

onSnapshot 方法在加载数据时接收回调。你不能返回一个值,因为没有人会接受它。此外,您的 getRealTimeChats 不是可观察的,因此您无法订阅它。 也许你可以返回一个自定义的 Observable。像这样的

getRealTimeChats(): any {
    const subject = new Subject();
    const observable = subject.asObservable();

    this.db.collection('chats').onSnapshot(querySnapshot => {
        const chat: ChatModel[] = [];
        querySnapshot.forEach(doc => {
            const data = doc.data() as ChatModel;
            chat.push(data);
        });
        subject.next(chat);
    });

    return observable;   
}

当你调用它时:

this.chatService.getRealTimeChats().subscribe((chats: ChatModel[]) => {
      this.chats = chats;
});

【讨论】:

  • 虽然这可以工作并在 HTML 上显示数据,但我仍然需要刷新页面才能查看我对数据库所做的任何添加,这不是预期的行为。它不是“实时的”
  • 不错!记得在 ngOnDestroy 上将订阅设置为取消订阅
猜你喜欢
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
  • 2020-08-08
  • 1970-01-01
相关资源
最近更新 更多