如果Firebase中存在一个节点(由云功能创建),我想递归检查,我尝试了很多东西,但是我在承诺,回调等之间丢失了一些东西,我无法使它工作。< / p>
以下是我尝试过的(在身份验证服务中):
checkifExist(userId:string){
const self=this;
firebase.database().ref('/users/'+userId).once('value', function(snap) {
return true;
}, function(error) {
console.log("user not yet created by CF :"+error);
// wait 2 seconds before to try again
setTimeout(() =>{
self.checkifExist(userId);
},2000);
});
我在一个组件中调用它:
if(this.auth.checkifExist(userId)){
// code if success
}
问题:
如果从未执行过成功,则代码,因为:
this.auth.checkifExist(userId) undefined
为什么呢?有什么想法吗?
答案 0 :(得分:3)
自行调用正在监听Firebase数据库中的数据的函数是一种反模式。这不是必需的,因为如果您使用on()
方法,Firebase侦听器已经可以连续监听数据。
执行所需操作的最简单方法是使用回调:
waitForUserData(userId:string, callback){
var ref = firebase.database().ref('/users/'+userId);
ref.on('value', function(snap) {
if (snap.exists()) {
ref.off('value'); // stop listening
callback();
}
}, function(error) {
// we don't have permission to read
throw error;
});
}
您将其调用为:
this.auth.waitForUserData(userId, function() {
// code if success
});
我改变的事情:
答案 1 :(得分:1)
正如我在评论中所说,我不是100%确定如何递归调用异步once
方法,但基于multiple, sequential fetch() Promise我会试一试:
checkifExist(userId:string){
const self=this;
return firebase.database().ref('/users/'+userId).once('value', function(snap) {
if (snapshot.val() === null) {
return false;
} else {
return true;
}
})
.then(function(response) {
if (response) {
return true;
} else {
self.checkifExist(userId);
}
})
.catch(function(err) {
console.log('error: ' + err);
//.....
});
}
请注意,once
会返回一个承诺,请参阅https://firebase.google.com/docs/reference/js/firebase.database.Reference#once