2 votes

Nodejs MongoDb Asynchronous Callback

Je viens de commencer à travailler avec NodeJs et à utiliser des fonctions asynchrones. J'ai essayé de faire plusieurs appels à MongoDB à partir d'une boucle for, et j'ai besoin d'attendre que tous les appels soient terminés avant de passer à l'étape suivante.

J'ai essayé de l'implémenter en utilisant async, mais il semble que toutes mes variables en dehors des appels ne soient pas accessibles. Comment faire pour que cela fonctionne ?

    var sample = req.body;  // sample will be an array list of items
    var stringList = "";

    var calls = [];
    for(var i = 0; i < sample.length; i++) {
console.log(sample[].item) // i can print it here
        calls.push(function(callback) {
            db3.table.find({column1:sample[i].item}, function(err, temp){  // i hit an error here, it cannot find sample[i].item...
                if (err)
                    return callback(err);
                stringList = stringList + temp[0].item2;
                callback(null, stringList );
            });
        });
    }

    async.parallel(calls, function(err, result) {
        if (err)
            return console.log(err);

console.log(result); // I am expecting a string of all the item2 returned and concatenated previously

});

1voto

Ratan Kumar Points 137

Async parallel callback envoie de toute façon les données au callback final, vous pouvez utiliser cette fonctionnalité pour fusionner toutes les valeurs envoyées.

var sample     = req.body;  // sample will be an array list of items
var stringList = "";
var calls      = [];
for (var i = 0; i < sample.length; i++) {
    console.log(sample[i].item) // i can print it here
    calls.push(function (callback) {
        db3.table.find({column1: sample[i].item}, function (err, temp) {
            // i hit an error here, it cannot find sample[i].item...
            if (err) {
                return callback(err);
            }
            callback(null, temp[0].item2);
        });
    });
}

async.parallel(calls, function (err, result) {
    if (err) {
        return console.log(err);
    }
    stringList = result.join('');
    console.log(stringList); // I am expecting a string of all the item2 returned and concatenated previously
});

0voto

David Vicente Points 1922

Vous pouvez peut-être vérifier si toutes les requêtes de la base de données sont terminées :

var sample = req.body;  // sample will be an array list of items
var stringList = "";
var counter = 0;
for(var i = 0; i < sample.length; i++) {
    console.log(sample[].item) // i can print it here
        db3.table.find({column1:sample[i].item}, function(err, temp){  // i hit an error here, it cannot find sample[i].item...
            if (err)
                throw err;
            stringList = stringList + temp[0].item2;
            if(++counter >= sample.length) {
                // when here you will have the whole string
                console.log(stringList); 
            }
        });
    });
}

0voto

shivshankar Points 1139

Chaque opération asynchrone peut être exprimée en termes de callback ou de promesse. voici deux exemples qui peuvent être utiles

//  sequential execution P.S. use for dependent tasks  
var operations= [1,2,3];
(function loop(index){
    if(index==operations.length) return ;
    setTimeout(function() {
        console.log(`hello ${operations[index]}`);
        loop(++index);
    }, 1000);
})(0)

//  parallel execution P.S. use when independent tasks  
Promise.all(operations.map(val=>{
    return new Promise((resolve, reject) => {
        console.log(`hello ${val}`);
    });
}))
.then(data=>{

})
.catch(err=>{
    console.log(err);
})

en savoir plus https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X