我在使用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)。当前,它同时保存。
我认为问题是movieRef
for循环中的for不会实时更新,或者由于某种原因它看不到先前保存的电影,导致以相同标题保存第二部电影(应跳过)。
如果刷新页面,则将再次调用相同的API,然后它会检测bot电影并跳过两个对象,这很好。。。但是它不能用于一个API调用。我希望这是有道理的。:|
谁能帮助解决这个难题?
提前致谢!
在这种情况下,问题是对Firebase的写入是异步的。这意味着在循环继续进行的同时,影片尚未真正写入数据库。
要变通解决此问题,我建议您执行以下步骤:
您可以查看Firebase文档,以获取有关多位置更新及其实施方式的更多信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句