sql >> Database teknologi >  >> NoSQL >> MongoDB

Ulovlig pauseerklæring (Node.js)

Din break statement er ikke inde i en loops brødtekst. Det er i stedet inde i en funktions krop, nemlig findOne ring tilbage. For at se dette tydeligere, kan det være nyttigt midlertidigt at bruge en navngivet funktion som din tilbagekaldsbehandler:

var cb = function(err, data){
    if (data.id){
        uniqueNumber++;
    }
    else {
        saveLandmark(newUnique);
        break;  // not inside a loop!
    }
};

db.collection('landmarks').findOne({'id':uniqueIDer}, function(err, data){
    //if ID exists already
    if (data.id){
        var uniqueNumber = 1;
        while (1) {
            var uniqueNum_string = uniqueNumber.toString(); 
            var newUnique = data.id + uniqueNum_string;
            db.collection('landmarks').findOne({'id':newUnique}, cb);
        }
    }
    else {
        saveLandmark(uniqueIDer);
    }
});

Det er ret tydeligt nu, at break i tilbagekaldsfunktionen er kroppen ikke inde i en løkke! Jeg har også fået tingene til at gå i stykker på andre måder, fordi uniqueNumber og newUnique værdier er ikke længere i rækkevidde, men det er en anden sag. :) Det vigtige at se her er, at en funktion introducerer en "hård" grænse i din kode, som kan være svær at se udelukkende baseret på sprogets syntaks. Dette er en af ​​grundene til, at denne tilbagekaldsstil af programmering kan være så vanskelig at få den rigtige.

Faktisk er det meget sværere at gøre dette, end dit oprindelige forsøg på koden ville antyde. Du skal have en måde at sende et successignal op gennem muligvis vilkårlige lag af tilbagekald, mens du gentagne gange ringer til findOne og analyser resultatet (asynkront).

Du kan muligvis få hjælp til dette ved at bruge den fremragende async bibliotek, for eksempel https://github.com/caolan/async#wilst .




  1. Integration af ClusterControl med SNMP - A Proof of Concept:Del 1

  2. MongoDB's ISODate() vs. UNIX-tidsstempel

  3. Dato-tidsproblemer med Mongo og C#

  4. opdatere i mongodb med $in-forespørgsel?