2016-12-25 7 views
0

У меня возник интересный вопрос. Общая идея того, что я делаю, - это вытащить данные из базы данных Firebase и заполнить таблицу на основе этих данных. Все происходит отлично во время начальной совокупности - ячейки и строки заполняются так, как они должны быть, но странная проблема заключается в том, что скрипты, похоже, выполняются снова случайным образом. Я зарегистрировал входящие данные на консоль и вижу, что он печатает дважды через некоторое время.Скрипт Java/Firebase, выполняющий несколько раз

Это второе исполнение не выполняется, если я должен перемещаться между страницами или перезагружать страницу - в любом из этих случаев все работает так, как должно. Проблема SEEMS произойдет, когда я запишусь обратно в свой компьютер после его блокировки ??? Кто-нибудь знает, что может здесь происходить? Соответствующая часть сценария ниже:

const table = document.getElementById('myTable'); 
firebase.auth().onAuthStateChanged(firebaseUser => { 
    if (firebaseUser) { 
     let user = firebase.auth().currentUser; 
     let uid = user.uid; 
     const dbRef = firebase.database().ref().child("data/" + uid); 
     dbRef.once('value', snap => { 
      var dataCount = snap.child("secondData").numChildren(); 
      var datalist = snap.child("secondData").val(); 
      var dataArray = Object.keys(datalist).map(function(k) { 
       return datalist[k] 
      }); 
      pullAllInfo(dataCount, dataArray); 
     }); 
    } 
}); 

function pullAllInfo(count, array) { 
    let k = 0; 
    let dataArray = []; 
    for (i = 0; i < count; i++) { 
     let specificRef = firebase.database().ref().child("secondData/" + array[i]); 
     specificRef.once('value', snap => { 
      var optionsTag = array[k]; 
      k++; 
      var dataId = snap.child("id").val(); 
      var dataName = snap.child("name").val(); 
      var dataCount = snap.child("data").numChildren(); 
      dataArray.push(dataId, dataName, dataCount, optionsTag); 
      if (k == count) { 
       buildTable(dataArray); 
       console.log(dataArray); 
      } 
     }); 
    } 
} 

Как видно из кода выше, я звоню .once() для каждой ссылки, что бы предотвратить дублирование данных от типичного .on() вызова. Кажется, это просто невозможно понять. ТАКЖЕ у меня есть iMac, только для тех, кто интересуется моей потенциальной диагностикой разблокировки компьютера.

Спасибо всем!

ответ

0

Я решил эту проблему, создав еще одно глобальное логическое значение, которое называется preLoaded. Вначале оно установлено на false и, как только данные будут загружены и переданы для построения таблицы, она установлена ​​в true. Теперь это выглядит так:

if(k == count && preloaded == false){ 
      preloaded = true; 
      console.log(dataArray); 
      buildTable(dataArray); 
     } 

Все комплекты!

1

Скорее всего, состояние auth меняется и отключает вашу функцию. Попробуйте бросить бревно под firebase.auth().onAuthStateChanged так:

firebase.auth().onAuthStateChanged(firebaseUser => { 
    console.log('auth state changed', firebaseUser); 
    if (firebaseUser) { 

Я думаю, что вы увидите, что AuthState меняется при выходе из системы/войти с вашего компьютера.

+0

Хорошо, я попробую, сразу после того, как мое текущее потенциальное решение либо преуспеет, либо не сработает (я выйду из любопытства) – Ethan

Смежные вопросы