【问题标题】:Firebase Database Reference doesn't detects the currently added nodeFirebase 数据库参考未检测到当前添加的节点
【发布时间】:2018-08-23 03:24:02
【问题描述】:

我遇到了一个关于 firebase 数据库引用的有趣问题,它似乎没有实时更新,或者它没有看到我在 for 循环中使用它时所做的更改。我会尝试解释它,但如果我的解释不够清楚,请随时提出任何问题。

  1. 当我加载页面时,会调用一个 API 并返回一个电影对象数组。

  1. 然后,从每个对象中,我获取 idtitle 属性,并将它们保存到 firebase 实时数据库,但在保存之前,我检查实际对象 title 是否已经存在于数据库,如果是,我跳过那部电影:

    createMovieObjects(movies: Array<IMovies>) {
    
      const movieObj = {};
    
      for (let i = 0; i < movies.length; i++) {
    
        const movieId = movies[i].id;
        const movieTitle = movies[i].title;
    
        // check if movie with same title exists in firebase
        let movieRef = this.afDb.list('/movies', res => res.orderByChild('title').equalTo(movies[i].title)).valueChanges();
    
        movieRef.subscribe(res => {
          if (res[0]) {
            console.log('TITLE EXISTS! SKIPPING... ');
          } else if (!res[0]) {
            movieObj[movieTitle + '-' + movieId] = {
              id: movies[i].id,
              title: movies[i].title,
              slug: this.as.urlOptimizeText(movies[i].title),
            };
            this.saveMovie(movieObj);
          }
        });
      }
    }
    
    saveMovie(movieObj: Object) {
      this.myMovieRef.update(movieObj);
    }
    

现在,有些情况下,当 API 返回对象时,titles 完全相同,但 ids 不同。在这种情况下,我想跳过第二个对象,只保存第一个(例如:37292)。目前,它同时保存了两者。

我认为问题在于 for 循环中的 movieRef 没有实时更新,或者由于某种原因它没有看到以前保存的电影,导致保存第二部电影具有相同的标题(应该跳过)。

如果我刷新页面,相同的 API 会再次被调用,然后它会检测机器人电影并跳过两个对象,这很好……但它不适用于一个 API 调用。我希望这是有道理的。 :|

谁能帮忙解开这个谜团?

提前致谢!

【问题讨论】:

  • 实时这个词有点欺骗性,因为它仍然需要一些时间才能从 firebase 存储或检索。在您的情况下,我认为您的 for 循环在电影实际保存在 firebase 之前仍在继续。在检查它们是否在 Firebase 中之前从列表中过滤掉重复项是一个想法吗?
  • 其实这是一个有趣的想法!我会考虑的...谢谢!
  • 顺便说一句,你说得对,在保存电影之前循环正在继续......这是导致问题的原因......有没有办法等待 firebase 先保存电影,然后继续到下一个循环?我想添加、中断和继续,但问题是我需要添加这些的位置超出了函数边界,因此它们不起作用。
  • 更新是一个承诺,所以你可以await它。
  • @Todor 我认为这样做既不可能也不明智。我个人会执行以下操作: 1. 从列表中删除重复项 2. 使用 for 循环检查电影是否在 firebase 3. 如果它不在 firebase 中,请将其添加到数组中 4. 在 for 循环完成后使用多位置更新一次性保存整个数组。

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


【解决方案1】:

这种情况下的问题是对 Firebase 的写入是异步的。这意味着电影尚未真正写入数据库中,而循环继续进行。

要解决此问题,我建议您执行以下步骤:

  1. 先过滤列表中的所有重复项,然后再检查它们是否存在于 Firebase 中。
  2. 使用循环检查电影是否存在于 Firebase 中,如果它们没有将它们添加到数组中(不要将它们保存在 Firebase 中)
  3. 循环结束后,使用多位置更新一次保存数组中的所有电影。

您可以查看the Firebase docs,了解有关多位置更新以及如何实施它们的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    相关资源
    最近更新 更多