как сделать соединения в таблицах Firebase

Я пытаюсь получить данные из двух таблиц, таких как (получить всех пользователей и их данные)

tableOne.on('users', function (snapshot) {
    userId = snapshot.val().userId; // line 1 (results like 1,2,3,4,5,6)
    anotherTable.child('userdetails').child(userId).once('value', function(mediaSnap) {
     // result // line 2
 });
});

но проблема в том, что строка 1 выполняется сначала для 6 раз, а затем строка 2, которая n раз приводит к тому, что каждый раз ищет "где идентификатор пользователя - 6"...разве соединения не поддерживаются в Firebase?

любая помощь приветствуются

2 ответов


ваш фрагмент кода имеет неприятный побочный эффект:

var userId;
tableOne.on('value', function (snapshot) {
    userId = snapshot.val().userId; // line 1 (results like 1,2,3,4,5,6)
    anotherTable.child('userdetails').child(userId).once('value', function(mediaSnap) {
        console.log(userId + ":" + mediaSnap.val().name);
    });
});

вы не объявляете userId как переменная, что означает, что она становится глобальной переменной в JavaScript. И поскольку функция обратного вызова выполняется асинхронно, есть хороший шанс, что глобальные значения будут изменены к тому времени, когда вам это нужно.

решение просто сделать userId локальная переменная функции обратного вызова:

tableOne.on('value', function (snapshot) {
    var userId = snapshot.val().userId; // line 1 (results like 1,2,3,4,5,6)
    anotherTable.child('userdetails').child(userId).once('value', function(mediaSnap) {
        console.log(userId + ":" + mediaSnap.val().name);
    });
});

Это гарантирует, что каждое значение userId захватывается внутри функции.


решение для списка присоединиться:

tableOne.orderByKey().on("value", function (snapshot) {
    //console.log(snapshot.val());
    snapshot.forEach(function (data) {
        tableTwo.once('value').then(function (info) {
            info = info.val();
        });
    });
});