2013-10-08 7 views
6

Sono in grado di inserire e recuperare i dati da un database neDB in nodejs. Ma non posso passare i dati al di fuori della funzione che lo recupera.Ottieni i dati neDB node.js in una variabile

Ho letto la documentazione di neDB e ho cercato e provato diverse combinazioni di callback e restituzioni (vedere il codice seguente) senza trovare una soluzione.

Sono nuovo di javascript quindi non so se sto fraintendendo come utilizzare le variabili in generale o se questo problema è legato all'uso di neDB in particolare o entrambi.

Qualcuno potrebbe spiegare perché "x" nel mio codice non contiene mai i risultati JSON dei documenti dal database? Come posso farlo funzionare?

var fs = require('fs'), 
    Datastore = require('nedb') 
    , db = new Datastore({ filename: 'datastore', autoload: true }); 

    //generate data to add to datafile 
var document = { Shift: "Late" 
       , StartTime: "4:00PM" 
       , EndTime: "12:00AM" 
       }; 

    // add the generated data to datafile 
db.insert(document, function (err, newDoc) { 
}); 

    //test to ensure that this search returns data 
db.find({ }, function (err, docs) { 
      console.log(JSON.stringify(docs)); // logs all of the data in docs 
     }); 

    //attempt to get a variable "x" that has all 
    //of the data from the datafile 

var x = function(err, callback){ 
db.find({ }, function (err, docs) { 
      callback(docs); 
     }); 
    }; 

    console.log(x); //logs "[Function]" 

var x = db.find({ }, function (err, docs) { 
     return docs; 
    }); 

    console.log(x); //logs "undefined" 

var x = db.find({ }, function (err, docs) { 
    }); 

    console.log(x); //logs "undefined"* 

risposta

6

richiamate vengono generalmente asincrono in JavaScript significa che non è possibile utilizzare operatore di assegnazione, di conseguenza, non si torna nulla dalla funzione di callback.

Quando si chiama una funzione asincrona, l'esecuzione del programma continua, passando l'istruzione 'var x = whatever'. L'assegnazione a una variabile, il risultato di tutto ciò richiamata viene ricevuto, è necessario eseguire all'interno della richiamata stessa ... quello che ti serve è qualcosa nelle linee di ...

var x = null; 
db.find({ }, function (err, docs) { 
    x = docs; 
    do_something_when_you_get_your_result(); 
}); 

function do_something_when_you_get_your_result() { 
    console.log(x); // x have docs now 
} 

EDIT

Here è un bel post di blog sulla programmazione asincrona. E ci sono molte più risorse su questo argomento che puoi raccogliere.

This è una libreria popolare che aiuta con il controllo del flusso asincrono per il nodo.

P.S.
Spero che questo aiuti. Per favore, con tutti i mezzi chiedi se hai bisogno di qualcosa chiarito :)

0

Ho dovuto imparare un po 'sulle funzioni asincrone per farlo bene. Per coloro che cercano aiuto specifico su come ottenere un valore di ritorno da nedb, ecco un frammento di ciò che ha funzionato per me. Lo stavo usando in elettrone.

function findUser(searchParams,callBackFn) 
{ 
    db.find({}, function (err, docs)) 
    { 
     //executes the callback 
     callBackFn(docs) 
    }; 
} 

usage 

findUser('John Doe',/*this is the callback -> */function(users){ 
    for(i = 0; i < users.length; i++){ 
     //the data will be here now 
     //eg users.phone will display the user's phone number 
    }}) 
Problemi correlati