【问题标题】:Getting realtime updates for document upon its creation?在创建文档时获取实时更新?
【发布时间】:2020-11-18 11:26:07
【问题描述】:

我有一个使用 Cloud Firestore 的 Angular 应用程序。我在一项服务中创建了一个函数,该函数从“评级”集合中获取用户评级。每个评分都存储在此集合中,文档 id 是用户 id 与电影 id 的组合。

getUserRating(movie_id) {
    return this.afAuth.authState.pipe(
      switchMap(user => {
        if (user) {
          return this.db.collection('ratings').doc(user.uid + '_' + movie_id).valueChanges();
        } else {
          return [];
        }
      })
    );
  }

我在组件中的 ngOnInit() 中执行此代码。

this.ratingService.getUserRating(this.release.id).subscribe(doc => {
    this.userRating = doc['rating'];
    this.ratingSliderValue = this.userRating;
}));

此代码的问题在于,如果文档已经存在,它会响应更改,但如果用户为电影设置了初始评级,它不会执行,因为文档以前不存在。该页面必须重新加载。有关如何使其正常工作的任何建议?

【问题讨论】:

  • 您应该对以前不存在的文档进行更改。你确定你不只是订阅 else 块中的空列表,它永远不会改变吗?
  • 我在 else 语句下运行了 console.log,但它再也没有返回。我不确定还有什么可能导致这种情况。
  • 已解决。发生这种情况是因为我没有处理未定义的数据。我添加了“if (doc) {}”,这似乎解决了问题。
  • 很高兴知道您自己解决了这个问题@KevinShiflett。请考虑将解决方案添加到您的帖子的答案中并接受它。这样,如果社区中的其他人面临与您相同的问题,他们可以轻松参考您的解决方案,此外这将有助于提高您在 Stack Overflow 上的声誉。 :)

标签: angular typescript firebase asynchronous google-cloud-firestore


【解决方案1】:

原来这是因为我没有处理未定义的响应。 valueChanges 返回一个未知的 observable 并且设置 doc['rating'] 抛出一个未定义的错误。用 if (doc) {} 封装代码解决了这个问题并监听了更新。

this.ratingService.getUserRating(this.release.id).subscribe(doc => {
    if (doc) {
       this.userRating = doc['rating'];
       this.ratingSliderValue = this.userRating;
    }
}));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-27
    • 2021-02-02
    • 1970-01-01
    • 2019-07-20
    • 2020-03-29
    • 2017-09-24
    • 1970-01-01
    • 2019-07-14
    相关资源
    最近更新 更多