如何在服务中创建一个方法,该方法返回onSnapshot的结果,然后在我的Component或Ionic Page中使用它?

问题描述 投票:2回答:2

我正在使用“ionic-angular”:“3.7.1”和Firebase Cloud Firestore。我希望每次更新,删除或添加所有文档到Post集合中。我知道调用onSnapshot方法我可以得到它所以我在服务中定义了这个方法。

getPosts(token: string){
  const userId = this.authService.getActiveUser().uid;
  let posts = [];
  return firebase.firestore().collection("Post").onSnapshot(function(querySnapshot) {
      querySnapshot.forEach(function(doc) {
          posts.push(doc.data());
        });
        console.log("Posts: ", posts.join(", "));
        return posts;
      });
}

所以在控制台中我可以在数组Posts中看到我的所有帖子,但如果在我的组件中使用this.post.getPosts(token)调用此方法,我会在控制台中获得此输出:

ƒ () {
  asyncObserver.mute();
  firestoreClient.unlisten(internalListener);
}

那么,如何在服务中创建一个方法,该方法返回onSnapshot的结果,然后在我的Component或Ionic Page中使用它?

文档

https://firebase.google.com/docs/reference/js/firebase.firestore.Query?hl=es-419

https://firebase.google.com/docs/firestore/query-data/listen?hl=es-419

angular typescript firebase ionic3 google-cloud-firestore
2个回答
0
投票

更新:

如果您需要了解如何使用qazxsw poi实现通用qazxsw poi,请参阅qazxsw poi。

旧反馈:

你需要在这里使用胖箭头功能,你在这里犯了很多错误。你可以尝试下面的service/provider

Firestore

this artcile


0
投票

这是你如何实现它:

从您的服务中返回一个Observable:

code

然后在您的组件或离子页面:

  getPosts(token: string){
    const userId = this.authService.getActiveUser().uid;
    let posts = [];

     retrun firebase.firestore().collection("Post").get().then((querySnapshot)=> 
     {
       querySnapshot.forEach((doc)=> {
           posts.push(doc.data());
      });
        return posts;
     });
 }

每当您更改任何帖子时,该更改都会反映在列表中,而您无需再次调用Doc

注意:

此外,如果您的服务仅限于getPosts(token: string) { const userId = this.authService.getActiveUser().uid; let posts = []; return new Observable(observer => { const unsubscribe = firebase.firestore().collection("Post").onSnapshot(querySnapshot => { querySnapshot.forEach(function(doc) { posts.push(doc.data()); }); observer.next(posts); }); return () => { unsubscribe(); }; }); } (我推荐),我建议您在启动服务时保留对const _this = this; // 'this' inside 'subscribe' refers to the observable object this.postsObserver = this.branchService.getPosts(token); this.postsObserver .subscribe({ next(posts) { _this.posts = posts; }, error(error) { console.log(error); }, // optional }); 集合的单一引用:

getPosts

posts不计入您的数据库配额,但通过在所述其他后续查询中使用posts来保持代码看起来更干净并没有什么坏处。

编辑:

添加了在销毁Observable时调用的“拆卸”功能。在这种情况下,当我们销毁Observable时,我们会阻止firebase实时监听器监听更多更新。为您的客户释放更多带宽。

参考文献:

  • this.postsRef = firebase.firestore().collection('Post');
  • firebase.firestore().collection('Post')
  • this.postsRef
© www.soinside.com 2019 - 2024. All rights reserved.