Firebase数据库参考不会检测当前添加的节点

时间:2018-03-14 14:33:06

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

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

  1. 当我加载页面时,会调用API并返回一个影片对象数组。
  2. enter image description here

    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);
      }
      
    2. 现在,有些情况下,当API返回对象时,它们具有完全相同的title,但不同的id。在这种情况下,我想跳过第二个对象,只保存第一个(例如:37292)。目前,它可以节省两者。

      enter image description here

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

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

      任何人都可以帮助解决这个谜团吗?

      提前致谢!

1 个答案:

答案 0 :(得分:1)

这种情况下的问题是对Firebase的写入是异步的。这意味着当循环继续进行时,电影还没有真正写入数据库。

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

  1. 在检查Firebase中是否存在重复项之前,先从列表中过滤所有重复项。
  2. 使用循环检查Firebase中是否存在影片,如果他们没有将影片添加到阵列中(请勿将其保存在Firebase中)
  3. 循环结束后,使用多位置更新一次保存阵列中的所有影片。
  4. 您可以查看the Firebase docs,了解有关多地点更新以及如何实施这些更新的详情。