Zwracanie danych z callback

Zwracanie danych z callback
SK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 68
0

Witam,

W wolnym czasie piszę sobie pewne API. Podpinam właśnie pod nie MongoDb. Mam już gotowe metody z zapytaniami, ale mam problem z przekazywaniem danych z callback 'wyżej'. Kod jest następujący:

Kopiuj
    
showUsers: function(db, object, callback){
        var cursor = db.collection('users').find(object);
        var data = [];
        cursor.each(function(err, doc) {
            assert.equal(err, null);
            if (doc != null) {
                data.push(doc);
            } else {
                callback(data);
            }
        });
    },

    dispatcher: function(callback, object){
        var result = mongoc.connect(DBHOST, function(err, db) {
            assert.equal(null, err);
            console.log("Connected correctly to mongodb server");
            var users = module.exports[callback](db, object, function(data){
                db.close();
                return data;
            });

            console.log(users);
        });
    }

W metodzie dispatcher() łączę się z mongo, po czym wywołuję metodę z odpowiednim query do bazy. Tam gdzie module.exportscallback w callback mogę bez problemu logować 'data', jednak gdy przypisuje całość do 'users' to późniejsze console.log(users); zwraca 'undefined'. Na początku sądziłem, że to niewielkie opóźnienie w dostarczaniu danych przez mongo, ale owrapowanie console.log(users) w setTimeout również nie pomaga. Ma ktoś jakieś sugestie jak rozwiązać problem ?

K4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 20
0

Moglbys powiedziec co chcesz osiagnac przez ten kod:

Kopiuj
 
var users = module.exports[callback](db, object, function(data){
                db.close();
                return data;
            });

Mam kilka pomyslow co ma ten kod robic, ale lepiej jak Ty to wytlumaczysz. Callback to jest funkcja? (prawdopodobie tak, ale pytam) Dlaczego w tym momencie uzywasz module.export?

Operacja laczenia z mongo jest asynchroniczna, poczytaj o tym w kontekscie JS, wtedy na pewno zrozumiesz dlaczego return to zly pomysl.

Maciej Cąderek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 1264
0

A nie prościej zrobić to w ten sposób:

Kopiuj
const showUsers = (db, queryObject) => db
    .collection('users')
    .find(queryObject)
    .toArray();

Jako wynik dostajesz promisa, w zależności z jakiego frameworka korzystasz możesz go obsłużyć następująco (tu go po prostu przekazuje jako JSON do klienta):

  • Express:
Kopiuj
showUsers(db, queryObject)
    .then(val => res.send(val));
  • Koa:
Kopiuj
this.body = yield showUsers(db, queryObject);

Callbacków należy unikać.

PS
Ten queryObject czy też object, jak to u siebie nazwałeś, jest trochę bez sensu - sugeruje, że można wykonać dowolnego "selecta" na userach, a nazwa funkcji tego nie obrazuje - albo wstaw zapytanie na sztywno albo zmień nazwę funkcji na bardziej adekwatną.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.