sql >> Base de Datos >  >> RDS >> Mysql

Preguntas del synchronous node.js

Hay algunos patrones de diseño que puede usar en node.js para ejecutar operaciones asíncronas secuenciales. En todos ellos, no puede ejecutar un ciclo cerrado esperando que suceda algo; debe dejar que se ejecute el único subproceso de Javascript en node.js y darle tantos ciclos como sea posible.

Iteración manual

Ponga el código para una iteración en una función local (normalmente la llamo next() ) y luego, cuando una iteración llama a su última función de finalización, puede llamar a next() de nuevo para iniciar la siguiente iteración. Puede finalizar la operación probando alguna condición y no llamando a next() si las cosas están hechas o las primeras líneas de next() puede probar para ver si ha terminado.

Consulte el ejemplo de código a continuación para ver cómo se vería su código con la iteración manual.

Promesas de secuencia

Si usa promesas para sus operaciones asincrónicas, entonces puede dejar que las promesas encadenadas hagan toda la secuencia por usted como en p().then(f1).then(f2).then(f3) . Puede ver un ejemplo de eso en esta respuesta:Promesas como async.each .

Usar el módulo asíncrono

El módulo asíncrono admite una serie de funciones de gestión asincrónica. Muchos lo encuentran muy útil; otros preferirían usar promesas para resolver problemas similares. En cualquier caso, tiene una serie de funciones diferentes para la secuenciación. Por ejemplo, si quisiera iterar una matriz de forma asíncrona, usaría algo como esto:

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

Aquí hay una versión de su código que hace la iteración manual usando un next() personalizado función de iteración.

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