Mysql
 sql >> база данни >  >> RDS >> Mysql

Въпроси от синхронния възел.js

Има няколко шаблона за проектиране, които можете да използвате в node.js за изпълнение на последователни асинхронни операции. Във всички тях не можете да стартирате стегнат цикъл в очакване нещо да се случи - трябва да оставите единствената Javascript нишка в node.js да работи и да й дадете възможно най-много цикли.

Ръчна итерация

Поставете кода за итерация в локална функция (обикновено я наричам next() ) и след това, когато една итерация извика последната си функция за завършване, можете да извикате next() отново, за да започнете следващата итерация. Можете да завършите операцията, като тествате някакво условие и не извиквате next() ако нещата са готови или първите редове на next() може да тества, за да види дали сте готови.

Вижте примерния код по-долу за това как би изглеждал вашият код с ръчна итерация.

Обещания за последователност

Ако използвате обещания за вашите асинхронни операции, тогава можете да оставите верижните обещания да направят цялата ви последователност вместо вас, както в p().then(f1).then(f2).then(f3) . Можете да видите пример за това в този отговор:Обещания като async.each .

Използвайте модула Async

Модулът Async поддържа редица асинхронни функции за управление. Мнозина го намират за много полезно - други биха предпочели да използват обещания за решаване на подобни проблеми. Във всеки случай той има няколко различни функции за последователност. Например, ако искате да итерирате масив асинхронно, бихте използвали нещо подобно:

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

Ето версия на вашия код, която извършва ръчната итерация с помощта на персонализиран next() итерационна функция.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Пребройте броя на NULL в един ред

  2. Има ли начин да видите подготвена заявка, тъй като тя ще бъде изпълнена в базата данни?

  3. Как да сортирате като хакерски новини

  4. Сума Множество реда Разлика в датата Mysql

  5. MySQL няма да позволи на потребителя да влезе:Грешка 1524