Jak na pořadí příkazů v cyklu v Node.js rubrika: Programování: JavaScript

1 skybedy
položil/-a 28.3.2015

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.

odkaz Vyřešeno
1 skybedy
odpověděl/-a 28.3.2015

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:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.