Перебор коллекции записей базы данных Firebase

#javascript #firebase #firebase-realtime-database

#javascript #firebase #firebase-база данных в реальном времени

Вопрос:

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

Ниже приведен мой код:

 dataRef.once("value", function(snapshot) {

          snapshot.forEach(function(childSnapshot) {

            var hymn_no             = childSnapshot.val().hymn_no;
            var hymn_category       = childSnapshot.val().hymn_category;
            var hymn_key            = childSnapshot.val().hymn_key ;
            var hymn_title          = childSnapshot.val().hymn_title;
            var hymn_verses         = childSnapshot.val().hymn_verse;
            var hymn_chorus         = childSnapshot.val().hymn_chorus;
            var hymn_author         = childSnapshot.val().hymn_author;

            console.log(hymn_no);
            console.log(hymn_category);
            console.log(hymn_key);
            console.log(hymn_title);
            console.log(hymn_verses);
            console.log(hymn_chorus);
            console.log(hymn_author);

            var hymns = [
                new Hymn({ 
                    "hymn_no": hymn_no, 
                    "hymn_category": hymn_category, 
                    "hymn_key": hymn_key, 
                    "hymn_title": hymn_title, 
                    "hymn_chorus": hymn_chorus,
                    "hymn_verses": hymn_verses, 
                    "hymn_author": hymn_author, 
                }),
            ];
            localStorage.setItem("Hymns", JSON.stringify(hymns));
            return JSON.parse(localStorage.getItem("Hymns"));
          });

    });
  

Ответ №1:

Вы создаете новый массив с одним гимном в нем и сохраняете этот новый массив на каждой итерации цикла.

Поскольку он хранится в том же ключе хранилища, он перезапишет все остальное, что там хранится

Это означает, что вы бы сохранили только последний сохраненный гимн.

Создайте массив вне цикла … вставьте новые элементы в этот массив внутри цикла … затем после завершения цикла сохраните весь массив один раз

 dataRef.once("value", function(snapshot) {
          var hymns = [];
          snapshot.forEach(function(childSnapshot) {
               //....    
               var item = new Hymn(...);
               // push each new item to array
               hymns.push(item);  
          });
          // loop done, store data
          localStorage.setItem("Hymns", JSON.stringify(hymns));
          // return array
          return hymns;    
});