如果Firebase中存在节点,如何递归检查?

时间:2018-04-27 10:12:45

标签: typescript firebase google-cloud-functions

如果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

为什么呢?有什么想法吗?

2 个答案:

答案 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