Firebase数据库参考未检测到当前添加的节点

沙巴

我在使用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返回对象时,它们具有完全相同title的,但具有不同id的。在那种情况下,我想跳过第二个对象,而只保存第一个(例如:37292)。当前,它同时保存。

在此处输入图片说明

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

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

谁能帮助解决这个难题?

提前致谢!

安德烈·库尔

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

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

  1. 在检查Firebase中是否存在重复项之前,请从列表中过滤掉所有重复项。
  2. 使用循环检查电影是否在Firebase中存在,是否没有将电影添加到数组中(不要将它们保存在Firebase中)
  3. 循环完成后,使用多位置更新一次保存阵列中的所有电影。

您可以查看Firebase文档,以获取有关多位置更新及其实施方式的更多信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章