Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Perguntas do node.js síncrono


Existem alguns padrões de design que você pode usar no node.js para executar operações assíncronas sequenciais. Em todos eles, você não pode executar um loop apertado esperando que algo aconteça - você tem que deixar o único thread Javascript no node.js rodar e dar-lhe tantos ciclos quanto possível.

Iteração manual

Coloque o código para uma iteração em uma função local (eu costumo chamá-lo de next() ) e quando uma iteração chama sua última função de conclusão, você pode chamar next() novamente para iniciar a próxima iteração. Você pode terminar a operação testando alguma condição e não chamando next() se as coisas forem feitas ou as primeiras linhas de next() pode testar para ver se você está pronto.

Veja o exemplo de código abaixo para saber como seu código ficaria com a iteração manual.

Promessas de sequência

Se você usar promessas para suas operações assíncronas, poderá permitir que as promessas encadeadas façam todo o seu sequenciamento para você, como em p().then(f1).then(f2).then(f3) . Você pode ver um exemplo disso nesta resposta:Promessas como async.each .

Usar o módulo assíncrono

O módulo assíncrono suporta várias funções de gerenciamento assíncrono. Muitos acham muito útil - outros preferem usar promessas para resolver problemas semelhantes. Em qualquer caso, ele possui várias funções diferentes para sequenciamento. Por exemplo, se você quisesse iterar uma matriz de forma assíncrona, usaria algo assim:
async.eachSeries(hugeArray, function iterator(item, callback) {
  if (inCache(item)) {
    callback(null, cache[item]); // if many items are cached, you'll overflow
  } else {
    doSomeIO(item, callback);
  }
}, function done() {
  //...
});

Aqui está uma versão do seu código que faz a iteração manual usando um next() personalizado função de iteração.
function runQuery(callback) {
    mysql.getConnection(function(err, connection) {
        if (err) {
            connection.release();
            callback(err);
            return;
        }

        var array = [];
        var count = 10;
        var index = 0;

        function next() {
            if (index++ < count) {
                array.push([index, 'master']);
                console.log('100-elements');
                connection.beginTransaction(function(err) {
                    if (err) {
                        // can't throw here in an async function
                        // use callback to communicate error
                        callback(err);
                        return;
                    }

                    var query = "insert into users(username, password) values ?";
                    connection.query(query, [array], function(err, rows) {

                        if (!err) {
                            //commit start
                            connection.commit(function() {
                                if (err) {
                                    console.error(err);
                                    connection.rollback(function() {
                                        console.error('rollback error');
                                        callback(err);
                                        return;
                                    });
                                } else {
                                    console.log("Commit");
                                    // now do the next iteration
                                    next();
                                } // if err
                            }); //commit end
                        } else {
                            console.log(err);
                            connection.rollback(function() {
                                callback(err);
                                return;
                            });
                        } // if                    
                    });
                });
            }
        }
    });
}