我遇到了firebase数据库引用的一个有趣问题,似乎它没有实时更新,或者它没有看到我在使用它时所做的更改在for循环中。我将尝试解释它,但如果我的解释不够清楚,请随时提出任何问题。
然后,从每个对象中,我获取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返回对象时,它们具有完全相同的title
,但不同的id
。在这种情况下,我想跳过第二个对象,只保存第一个(例如:37292)。目前,它可以节省两者。
我认为问题是for循环中的movieRef
没有实时更新,或者由于某种原因它没有看到之前保存的电影,导致保存第二部电影相同的标题(应该跳过)。
如果我刷新页面,则会再次调用相同的API,然后它会检测机器人电影并跳过这两个对象,这很好......但它不适用于一个API调用。我希望这是有道理的。 :|
任何人都可以帮助解决这个谜团吗?
提前致谢!
答案 0 :(得分:1)
这种情况下的问题是对Firebase的写入是异步的。这意味着当循环继续进行时,电影还没有真正写入数据库。
要解决此问题,建议您执行以下步骤:
您可以查看the Firebase docs,了解有关多地点更新以及如何实施这些更新的详情。