Jak na pořadí příkazů v cyklu v Node.js rubrika: Programování: JavaScript
Vím, že je to přirozená vlastnost Node, vím, že to souvisí s jeho asynchronností, ale už druhý den se mi nedaří přijít jak se pohnout z místa s následující situací.
Potřebuju určitým způsobem dostat do DB data z HTML tabulky, používám k tomu Cheerio a Async.
Takže mám třeba tabulku se třemi řádky a mám:
fs.readFile('test.html','utf-8',function(err,res){ $ = cheerio.load(res); $('table tr').each(function(){ //tady si vytáhnu z jedné buňky tabulky nějaké data var id = $(this).find('td').eq(0).text().trim(); //první SQL var sql = "SELECT ..."; db.query(sql1,function(err,dbd1){ console.log(sql1); if(dbd1.length > 0){ //druhé SQL var sql2 = "INSERT..."; db.query(sql2, function (err, dbd2) { console.log(sql2); }) } }) }); });
Nejspíš zcela tak jak má, mi to provede a vypíše příkazy v pořadí:
SELECT...
SELECT...
SELECT...
INSERT...
INSERT...
INSERT...
Jenže já potřebuju, aby to proběhlo v pořadí:
SELECT...
INSERT...
SELECT...
INSERT...
SELECT...
INSERT...
Zkouším to i pomocí Async Waterfall a mám:
fs.readFile('test.html','utf-8',function(err,res){ $ = cheerio.load(res); $('table tr').each(function(i){ var id = $(this).find('td').eq(0).text().trim(); async.waterfall([ function(callback) { var sql = "SELECT..."; db.query(sql,function(err,dbdata){ console.log(sql); callback(null); }); }, function(callback) { var sql = "INSERT..."; db.query(sql,function(err,dbdata){ console.log(sql); callback(null); }) } ], function (err, result) { // něco, v téhle chvíli nepodstatného }); }); });
Nicméně pořadí je stejné jako u callbackové klasiky.
Jak jsem už psal, potřebuju, aby se příkazy provedly v pořadí jeden po druhém postupně v každém cyklu zvlášť a asi je dobré říct, že v Node zatím nejsem žádný velký profík.
Díky za každou radu.
Tak jsem to nakonec vykutil sám a cesta vedla přes async.whilst, třeba se to někomu bude hodit
fs.readFile('test.html','utf-8',function(err,res) { var id = []; $ = cheerio.load(html); $('table tr').each(function (i) { id.push($(this).find('td').eq(1).text().trim()); }); var i = 1; var last_i = id.length; async.whilst(function () { return i <= last_i; }, function (next) { var sql1 = "SELECT...."; db.query(sql1, function (err, dbd1) { //sql1 if (dbd1.length > 0) { var sql2 = "INSERT..."; db.query(sql2, function (err, dbd2) { //sql2 }); } i++; next(); }) }, function (err) { // Hotovo }); });
Pro plný přístup na Devel.cz se prosím přihlaste:
Nebo se přihlaste jménem a heslem: