【发布时间】:2018-08-23 03:24:02
【问题描述】:
我遇到了一个关于 firebase 数据库引用的有趣问题,它似乎没有实时更新,或者它没有看到我在 for 循环中使用它时所做的更改。我会尝试解释它,但如果我的解释不够清楚,请随时提出任何问题。
- 当我加载页面时,会调用一个 API 并返回一个电影对象数组。
-
然后,从每个对象中,我获取
id和title属性,并将它们保存到 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