2016-12-05 2 views
0

Ich versuche, mehrere Daten aus der Datenbank zu lesen, sie in ein Array zu legen und mit dem Array umzugehen. Der Code sieht wie folgt aus:node js: Wie kann eine Funktion nach einer Reihe von Datenbanklesevorgängen ausgeführt werden?

var array = []; 
// first for loop 
for (var i = 0; i < 10; i++) { 
    db.read(i, function(rs) { // read data from database and put it into array 
     array.push(rs); 
    } 
} 
// second for loop 
for (int i = 0; i < 10; i++) { 
    console.log(array[i]); 
} 

dieses Stück Code wird jedoch nicht funktionieren, weil die zweite for-Schleife ausgeführt wird, bevor die erste Schleife endet. Gibt es irgendwelche guten Lösungen? Übrigens, ich habe so benutzten Versprechen:

var array = []; 
var promise = new Promise(function(resolve, reject) { 
    for (var i = 0; i < 10; i++) { 
     db.read(i, function(rs) { // read data from database and put it into array 
      array.push(rs); 
     } 
    } 
    resolve(array); 
}; 
promise.then(function(array) { 
    for (int i = 0; i < 10; i++) { 
     console.log(array[i]); 
    } 
}; 

Es funktioniert auch nicht, so scheint es, dass die Entschlossenheit wird nicht warten, bis alle db Leseoperationen zu beenden. Wann wird die Lösung warten, bis der vorherige Code fertig ist?

+1

Werfen Sie einen Blick auf [ 'Promise.all'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all). Unterstützt Ihre Datenbank die Rückgabe von 'Promise' statt eines Rückrufs? – qxz

+0

http://stackoverflow.com/questions/6597493/synchronous-database-queries-with-node-js – Adiii

Antwort

0

der beste Weg, um Ihre Anforderung zu vervollständigen verwenden Sie async.

var name = ["shekhar", 'vishal', "param", "abhishek", 'amit']; 
    for (var i = 0; i < 5; i++) { 
     var item = name[i];//execute your first loop here 
    } 
    async.eachSeries(name, processData, function (err) { 
     if (err) { 
      res.json({status: 0, msg: "OOPS! How is this possible?"}); 
     } 
     res.json("Series Processing Done"); 
    }) 
    function processData(item, callback) { 
//execute your second loop here 
     }); 
+0

Got it, danke! Ich habe einen anderen Weg für die Synchronisation gelernt, neben dem Versprechen von Ihrer Antwort! – Tom

0

Mit Versprechungen sollte der asynchrone Codeblock ein Versprechen abgeben.

Die Datenbank-Lesefunktion sollte ein Versprechen zurück und leicht wie

neu geschrieben werden können
function readFromDatabase(i){ 
    return new Promise(function(resolve, reject){ 
     db.read(i, function(rs) { // read data from database and put it into array 
      resolve(rs); 
     } 
    }); 
} 

Sie dann Ihre Schleife laufen und alle Werte aus der Datenbank erhalten, warten auf die Versprechungen und auf das Ergebnis in der .then() Funktion, wo Sie von ihnen iterieren können.

//We create an empty array to store our promises 
var arrayOfPromises = []; 
for (var i = 0; i < 10; i++) { 
    //We push each promise to the array 
    arrayOfPromises.push(readFromDatabase(i)); 
} 

//We wait until all promises have 
Promise.all(arrayOfPromises) 
    .then(function(arrayOfResults){ 
     //arrayOfResults is an array with the resolved values from the 'readFromDatabase' function 
    }) 
    .catch(function(){ 
     //Handle errors 
    }); 
+0

Vielen Dank! Löse einfach mein Problem! – Tom

Verwandte Themen