Mysql
 sql >> Database >  >> RDS >> Mysql

Domande dal sincrono node.js

Esistono alcuni modelli di progettazione che puoi utilizzare in node.js per eseguire operazioni asincrone sequenziali. In tutti loro, non puoi eseguire un ciclo stretto in attesa che succeda qualcosa:devi lasciare che il singolo thread Javascript in node.js venga eseguito e dargli il maggior numero di cicli possibile.

Iterazione manuale

Inserisci il codice per un'iterazione in una funzione locale (di solito la chiamo next() ) e quindi quando un'iterazione chiama la sua ultima funzione di completamento, puoi chiamare next() di nuovo per iniziare l'iterazione successiva. Puoi completare l'operazione verificando alcune condizioni e non chiamando next() se le cose sono state fatte o le prime righe di next() può provare per vedere se hai finito.

Consulta l'esempio di codice riportato di seguito per l'aspetto del tuo codice con l'iterazione manuale.

Sequenza promesse

Se usi le promesse per le tue operazioni asincrone, puoi lasciare che le promesse concatenate facciano tutto il tuo sequenziamento come in p().then(f1).then(f2).then(f3) . Puoi vederne un esempio in questa risposta:Promesse come async.each .

Utilizza il modulo Async

Il modulo asincrono supporta una serie di funzioni di gestione asincrona. Molti lo trovano molto utile, altri preferirebbero usare le promesse per risolvere problemi simili. In ogni caso, ha diverse funzioni per il sequenziamento. Ad esempio, se si desidera eseguire un'iterazione di un array in modo asincrono, utilizzare qualcosa del genere:

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() {
  //...
});

Ecco una versione del tuo codice che esegue l'iterazione manuale utilizzando un next() personalizzato funzione di iterazione.

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                    
                    });
                });
            }
        }
    });
}