sql >> Databasteknik >  >> RDS >> Mysql

Frågor från den synkrona node.js

Det finns några designmönster du kan använda i node.js för att köra sekventiella asynkrona operationer. I dem alla kan du inte köra en tight loop i väntan på att något ska hända - du måste låta den enda Javascript-tråden i node.js köras och ge den så många cykler som möjligt.

Manuell iteration

Lägg koden för en iteration i en lokal funktion (jag brukar kalla den next() ) och sedan när en iteration anropar sin senaste kompletteringsfunktion, kan du anropa next() igen för att starta nästa iteration. Du kan avsluta operationen antingen genom att testa något villkor och inte anropa next() om saker är gjorda eller de första raderna i next() kan testa för att se om du är klar.

Se kodexemplet nedan för hur din kod skulle se ut med manuell iteration.

Sekvenslöften

Om du använder löften för dina asynkrona operationer kan du låta kedjade löften göra all din sekvensering åt dig som i p().then(f1).then(f2).then(f3) . Du kan se ett exempel på det i det här svaret:Löfter som async.each .

Använd Async-modulen

Async-modulen stöder ett antal asynkrona hanteringsfunktioner. Många tycker att det är väldigt användbart – andra skulle föredra att använda löften för att lösa liknande problem. Den har i alla fall en rad olika funktioner för sekvensering. Om du till exempel vill iterera en array asynkront, skulle du använda något sånt här:

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

Här är en version av din kod som gör den manuella iterationen med en anpassad next() iterationsfunktion.

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



  1. En till många relation i MyBatis

  2. mysql:varför att jämföra en 'sträng' med 0 ger sant?

  3. gjuter en flytande till decimal i mysql

  4. Parameter Sniffing Primer