Метод Javascript всегда возвращает ложь

0

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

Когда я console.log внутри функции, он регистрируется правильно, однако он никогда не возвращает true.

Auth Представляет базовый Firebase Auth Factory

var newUser = function(id) {
  ref.child('users').child(id).once('value', function(snapshot) {
    console.log(snapshot.val() === null);
    return (snapshot.val() === null);
  });
};

Auth.$onAuth(function(authData) {
  console.log(Boolean(newUser(authData.uid)));
  if (authData && !!(newUser(authData.uid))) { // add user if first time login
    $scope.authData = authData;
    ref.child('users').child(authData.uid).$save({
      provider: authData.uid,
      name: getName(authData),
      blah: 'blah'
    });
    $state.go('main.home');
  } else if (authData) {
    $state.go('main.home');
  } else {
    console.log('Not Logged In');
  }
});
  • 0
    «Метод Javascript всегда возвращает false» Нет, он всегда возвращает undefined.
Теги:
firebase

1 ответ

0
Лучший ответ

Ваша новая пользовательская функция ничего не возвращает. Возможно, это поможет вам увидеть, если вы переместите свою функцию обратного вызова в свою собственную именованную функцию.

var onValue = function(snapshot) {
  console.log(snapshot.val() === null);
  return (snapshot.val() === null);    
};

var newUser = function(id) {
  ref.child('users').child(id).once('value', onValue);
  // new user doesn't return anything
};

Когда вы опускаете возвращаемое значение, функция автоматически возвращает undefined, который вы принудительно выполняете в логическом режиме, что приводит к false.

Проблема здесь в том, что обратный вызов для метода Firebase .once запускается после того, как ваша функция (не) возвращает значение. Это потому, что он асинхронный.

Это довольно распространенная проблема для новых разработчиков Javascript, но ее можно легко визуализировать с помощью небольшого примера.

function doAsync() {
  setTimeout(function() {
    console.log('a');
    return 'a';
  }, 3000);

  console.log('b');
  return 'b';
}
doAsync();

Какой порядок вы ожидаете от выполнения console.log? Какое значение вы ожидаете, что функция вернется? Если это не очевидно, потратьте немного времени на эксперимент с кодом в консоли.

Очевидно, что все еще важно иметь возможность получать значения из асинхронных функций. Один из способов сделать это - с функциями обратного вызова.

В вашем случае вы добавите параметр обратного вызова к своей новой пользовательской функции, а затем вызовите эту функцию с новым пользователем, как только она станет доступной.

var newUser = function(id, done) {
  ref.child('users').child(id).once('value', function(snapshot) {
    done(snapshot.val() === null);
  });
};

Затем измените свой другой код, чтобы работать с этим стилем.

Auth.$onAuth(function(authData) {
  newUser(authData.uid, function(val) {
    // do something with the result
  });
});
  • 0
    Спасибо, Дэн! Я закончил тем, что поместил это в обещание и проверил данные после того, как обещание решено. Очень хорошее объяснение того, что происходило в Javascript.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню