2014-09-07 11 views
6

Próbuję pobrać dane z dwóch tabel jak (pobranie wszystkich użytkowników i ich szczegóły)jak zrobić przyłącza na stołach 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 
}); 
}); 

ale problemem jest linia 1 wykonuje pierwszy do 6 razy, a następnie linii 2, które n razy skutkuje za każdym razem szukaniem "gdzie identyfikator użytkownika to - 6" ... czy połączenia nie są obsługiwane w Firebase?

Każda pomoc jest apreciated

+2

Powinieneś przeczytać ten artykuł: https://www.firebase.com/blog/2013-10-01-queries-part-one.html#join i rozważ użycie tej biblioteki: http: //firebase.github .io/firebase-util /. Zauważ też, że 'on ('users'' nie jest prawidłowym wydarzeniem.) Prawdopodobnie szukałeś' on (' value'' lub 'on ('child_added''.) –

+0

Frank, pracowałem tylko nad pierwszym linkiem, ale problemem czy pobierają one pojedyncze szczegóły i chcę pobrać wszystkie szczegóły z pierwszej tabeli i odpowiednie szczegóły z drugiej tabeli – Luckyy

+0

drugi link wygląda lepiej, będzie wyglądał, czy może mi pomóc ... dzięki – Luckyy

Odpowiedz

7

Twój fragment kodu ma przykry efekt uboczny:

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); 
    }); 
}); 

Nie jesteś uznającą userId jako zmienna, co oznacza, że ​​staje się zmienną globalną w JavaScript. Ponieważ funkcja wywołania zwrotnego jest wykonywana asynchronicznie, istnieje duża szansa, że ​​wartości globalne ulegną zmianie do czasu, kiedy będzie potrzebna.

Rozwiązaniem jest po prostu dokonać userId zmienną lokalną funkcji wywołania zwrotnego:

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); 
    }); 
}); 

To zapewni, że każda wartość userId jest wychwytywany wewnątrz funkcji.

+0

Frank, dzięki, ale to nie był kompletny kod, ofcourse userid to lokalna zmienna, którą zadeklarowałem tuż nad łączeniem, a problem polega na tym, że linia 1 wykonuje się 6 razy, więc przesłoni wartość userId i ostatnia wartość zostanie użyta w następnym zapytaniu – Luckyy

+0

Nawet jeśli zdefiniujesz 'userId' powyżej łączenia, to będzie ono nadal udostępniane przez wszystkie wywołania zwrotne, a ponieważ wywołania zwrotne są uruchamiane asynchronicznie (i często w partiach), twoje problemy są prawdopodobnie spowodowane tym. –

+0

Dziękuję za wszystkie rozwiązania .... ale 1) po tym getPriority zmieniła kolejność zawartości, miałem ustawiony priorytet w pierwszej tabeli, ale po sprzężeniu kolejność danych jest inna .... 2) nie jest porządku przez obsługiwane bez priorytetu? – Luckyy

Powiązane problemy