Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Nodejs, dodatek mysql, funcja client.query
Forum PHP.pl > Forum > Serwery WWW
e-mati
Witam, chce na serwerze nodejs pobrać dane z bazy i dodać te dane do obiektu sesji. W pliku lib.js mam tą funkcje do pobierania danych:

Kod
lby.getUserData = function(userId, fn) {
    var self = this;
    self.data = {};
    mysqlc.query("SELECT * FROM za_users WHERE `id` = ?", [userId],
        function(err, results) {
            if (err) {
                throw err;
            }
            self.data = results;
        });
    return self.data;
}


po wywołaniu funkcji w głównym pliku dostaje pusty obiekt {}. Kombinowałem już 3 dni nad tym.I już nie mam głowy do tego. Próbowałem przenosić dane do zmienne w this, robiłem zwykłą zmienna, i za każdym razem dostaje pusty obiekt. Wiem, że jakbym funkcje mysqlc.query dał do głównego pliku tam gdzie chce pobrać dane to by zdziałało, ale chce mieć czysty i poukładany kod.

Z góry dziękuje smile.gif
wookieb
Wiesz co to jest asynchroniczność wywołań?
Po prostu funkcja przypisująca dane do do self.data została wywołana PO zwróceniu wyniku przez getUserData
Po co w ogóle bierzesz się za taką technologię skoro JS nawet nie znasz wystarczająco dobrze?
e-mati
Wole uczyć się w praktyce niż czytać mase książek, kursów, bo wtedy lepiej i szybciej przyswajam wiedzie.

Pomijając temat mojego niedouczenia. Jak mam to zrobić zeby funkcja getUserData zwróciła dane z funkcji w funkcji mysqlc.query?
wookieb
Nie da sie.
e-mati
Dzięki za pomoc. smile.gif
zegarek84
poczytaj i po testuj albo kody związane z hasłem programowanie zdarzeniowe, albo poczytaj o wzorcu obserwator (w zasadzie chodzi o programowanie zdarzeniowe)...

js jest delikatnie ustawiony na inną filozofię - właśnie na tą zdarzeniową... samą zdarzeniówkę można wprowadzić na kilka sposobów - najprostszy (gdyż nie chcę tu rozwijać nie wiadomo jakich kwestii) to masz funkcję "nasłuchującą" w sensie sprawdzającą co jakiś warunek lub każde zdarzenie i w niej wywołujesz dalszy łańcuszek - więc w najprostszym modelu taka funkcja jest bardziej rozbudowanym if'em (ale to moje tłumaczenie ;p)...

więc na takie najprostsze spojrzenie to w tym kodzie co podałeś nie powinno być return a tak zwany callback uruchomiony (choć nie do końca - gdyż ta funkcja mogła być w kodzie w prostej wersji na żywca zapisana) - tak więc po jakimś zdarzeniu po prostu wywołujesz dalszy "łańcuszek" "pokarmowy" ;p np. w stylu:
mysqlc.query("SELECT * FROM za_users WHERE `id` = ?", [userId],
Kod
        function(err, results) {
            if (err) {
                throw err;
            }
            self.data = results;
mojaFunkcja(jakis_opcjonalny_parametr);
        });

i tu zapominasz o return prawie zawsze przy programowaniu zdarzeniowym a głównie skupiasz się na przekazywaniu zmiennych czy to jako parametr funkcji czy wcześniej zapisujesz do zmiennych "globalnych" lub prawie globalnych - w js to akurat zależy od tak zwanego zasięgu (czyli "scope") - "wolność Tomku w swoim domku"

w php niemal identycznie można pisać ale tak próbować to zalecam jedynie przy deamonach pracujących w tle zwłaszcza nasłuchujących na socketach (wkurza mnie limit z tymi intami i że to nie dopracowane - ktoś powie, że nie do tego język stworzony - język jest tylko narzędziem ;]) - ale ogólnie fajnie jest sobie logikę ułożyć zdarzeniowo nawet jeśli wewnątrz kod jest zawarty "na żywca"... - oczywiscie przy aplikacjach działających stale to w zasadzie pisanie zdarzeniowo to obowiązek ;]
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.