Не удается получить доступ к данным в моем массиве с помощью firebase Realtime data

#javascript #firebase #google-chrome-extension

# #javascript #firebase #google-chrome-расширение

Вопрос:

Итак, у меня есть 2 плейлиста, созданных в моей базе данных с именем списка воспроизведения и идентификатором. Я пытаюсь отобразить список созданных мной плейлистов. Я смог Console.log (плейлисты) получить массив из моих 2 объектов с нужными данными в нем. но я не могу получить доступ к своим объектам в моем массиве. Я пробовал forEach, map, даже просто просматривая первый индекс, я всегда получаю undefined в своей консоли. Хотелось бы получить помощь. Просмотр изображения для результатов консоли snipit

 function getPlayLists(b) {
  firebase.auth().onAuthStateChanged(function (user) {
    if (user) {
      var uid = auth.currentUser.uid;
      var playlists = [];
      database.ref(uid).on("value", function (snapshot) {
        snapshot.forEach(function (childSnapshot) {
          playlists.push({
            playlistName: childSnapshot.val().name,
            id: childSnapshot.val().idKey,
          });
        });
      });
      console.log(playlists);
      console.log(playlists[0]);
    } else {
      console.log("No user is signed in.");
    }
  });
} 

введите описание изображения здесь

Комментарии:

1. database.ref(uid).on("value", function (snapshot) { является асинхронным, он в основном всегда выполняется после ваших console.log инструкций. Переместите console.log в тело on("value", function (snapshot) { или оберните эту функциональность обещанием или обратным вызовом.

Ответ №1:

Ваша консоль.операторы журнала вызываются перед заполнением списка воспроизведения данными. Переместите консоль.входит в функцию, которая передается в метод database.ref(uid).on

Ответ №2:

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

   database.ref(uid).on("value", (snapshot) => {
    const playlists = snapshot.map((childSnapshot) => ({
      playlistName: childSnapshot.val().name,
      id: childSnapshot.val().idKey
    }));
    console.log(playlists);
    console.log(playlists[0]);
  });