Как проверить рекурсивно, существует ли узел в Firebase? - PullRequest
0 голосов
/ 27 апреля 2018

Я хотел бы рекурсивно проверить, существует ли узел в Firebase (созданный с помощью функции cloud), я пробовал много вещей, но я немного потерян между обещаниями, обратными вызовами и т. Д., И я не могу заставить его работать.

Вот что я попробовал (в сервисе аутентификации):

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) равен не определено

почему? Есть идеи?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Самовывоз функции, которая прослушивает данные в базе данных Firebase, является анти-паттерном. В этом нет необходимости, поскольку прослушиватели Firebase уже могут непрерывно прослушивать данные, если вы используете метод on().

Самый простой способ сделать то, что вы хотите, это с помощью обратного вызова:

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
});

Вещи, которые я изменил:

  • Передать обратный вызов, который будет вызывать функция после считывания значения из базы данных.
  • Кажется, вы предполагаете, что обработчик ошибок будет вызван, если не существует никакого значения, что неверно. Если значения не существует, обратный вызов будет вызван с пустым снимком.
0 голосов
/ 27 апреля 2018

Как сказано в моем комментарии, я не уверен на 100%, как вызывать асинхронный метод once рекурсивно, но на основе множественного последовательного вызова fetch () Я попробую:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...