Nodejs Synchrone Pour chaque boucle
Je veux faire un pour chaque boucle, mais qu'il fonctionne de manière synchrone. Chaque itération de la boucle qui va faire un http.obtenir de l'appel et qui sera de retour json pour insérer les valeurs dans une base de données. Le problème est que la boucle for s'exécute de façon asynchrone et qui cause l'ensemble de l'http.arrive à tous de fonctionner à la fois et ma base de données n'est pas l'insertion de toutes les données.Je suis à l'aide asynchrone foreach pour essayer de faire ce que je veux faire, mais je n'ai pas à l'utiliser si je peux faire de la bonne façon.
mCardImport = require('m_cardImport.js');
var http = require('http');
app.get('/path/hi', function(req, res) {
mCardImport.getList(function(sets) {
forEach(sets, function(item, index, arr) {
theUrl = 'http://' + sets.set_code + '.json';
http.get(theUrl, function(res) {
var jsonData = '';
res.on('data', function(chunk) {
jsonData += chunk;
});
res.on('end', function() {
var theResponse = JSON.parse(jsonData);
mCardImport.importResponse(theResponse.list, theResponse.code, function(theSet) {
console.log("SET: " + theSet);
});
});
});
});
});
});
et mon modèle
exports.importResponse = function(cardList, setCode, callback) {
mysqlLib.getConnection(function(err, connection) {
forEach(cardList, function(item, index, arr) {
var theSql = "INSERT INTO table (name, code, multid, collector_set_num) VALUES "
+ "(?, ?, ?, ?) ON DUPLICATE KEY UPDATE id=id";
connection.query(theSql, [item.name, setCode, item.multid, item.number], function(err, results) {
if (err) {
console.log(err);
};
});
});
});
callback(setCode);
};
source d'informationauteur user3447415
Vous devez vous connecter pour publier un commentaire.
Avec la récursivité, le code est assez propre. Attendre la réponse http à revenir ensuite d'incendie à la prochaine tentative. Je ne pense pas que pour-chacun est la meilleure approche.
Une dernière remarque: ce n'est qu'une approche pour résoudre ce problème. Une solution à l'aide de promesses serait aussi bien travailler et serait compatible avec de nombreux promesse orientée vers les bibliothèques qui aident à gérer la planification des opérations asynchrones.
À boucle et de façon synchrone de la chaîne asynchrone actions, la solution la plus propre est probablement d'utiliser une promesse de la bibliothèque (les promesses sont introduites dans l'ES6, c'est le chemin à parcourir).
À l'aide de Bluebirdcela pourrait être
J'ai découvert que je n'étais pas la libération de mes connexions mysql après avoir été fait avec chaque appel et ce ligoté les connexions de le faire échouer et semblent être un problème de synchronisation.
Après appelant explicitement
connection.release();
il la cause de mon code fonctionne correctement à 100%, même de façon asynchrone.Merci pour ceux qui ont mis à cette question.