2015-08-18 2 views
-4

Я хотел бы получить синхронные результаты.
Все, что я хочу, хочу ввести данные, разделив 5000 на единицу.
Однако в результате асинхронного перечисления он борется.
Я хочу видеть в результате синхронных языков, таких как java.
Вопросы от синхронного узла.js

Я хочу, чтобы эти результаты:

100-elements 
commit 
100-elements 
commit 
100-elements 
commit 
100-elements 
commit 

Однако, в настоящее время код получает эти результаты:

100-elements 
100-elements 
100-elements 
100-elements 
100-elements 
. 
. 
. 
. 
100-elements 
commit 
commit 
commit 
commit 
commit 
commit 
commit 
. 
. 
. 
. 
commit 

Как я могу получить эти результаты? Пожалуйста, помогите мне. Спасибо.

mysql.getConnection(function(err, connection){ 

    if(err){ connection.release(); return; } 

    var array = []; 
    var count = 300000; 
    var length = count; 

    for(var i=0; i<count; i++){ 

    (function(currentI, master){ 
     process.nextTick(function(){ 

     array.push([currentI, master]); 

     if(currentI % 5000 === 0){ 
      console.log('100-elements'); 
      array = []; 

      connection.beginTransaction(function(err){ 
      if(err){ 
       throw err; 
      } 

      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'); 
         throw err; 
        }); 
        } else { 
        console.log("Commit"); 
        }//if err 
        }); //commit end 
       } else { 
            console.log(err); 
       connection.rollback(function(){ 
        throw err; 
       }); 
       } // if 
      }) // cnnection query 
      }); // beginTransaction 
     } //if 

     }); 
    }(i, 'master')); 
    } //for 
}) // getConnection 

ответ

0

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

Руководство Итерация

Поместите код для итерации в локальной функции (я обычно называю это next()), а затем, когда одна итерация называет свою последнюю функцию завершения, вы можете вызвать next() снова начать следующую итерацию , Вы можете закончить операцию либо путем тестирования некоторого состояния, либо не вызвав next(), если все будет сделано, либо первые строки next() могут проверить, не закончились ли вы.

См. Пример кода ниже, как выглядит ваш код с ручной итерацией.

Sequence обещает

Если вы используете обещания для асинхронных операций, то вы можете позволить прикован обещает сделать все ваши последовательности для вас, как и в p().then(f1).then(f2).then(f3). Вы можете увидеть пример этого в этом ответе: Promises like async.each.

Используйте Асинхронный модуль

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

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

@deathquin - это ответ на ваш вопрос? – jfriend00

+0

У меня нет вопросов Спасибо! – deathquin

+0

@deathquin - тогда процедура здесь, в StackOverflow, заключается в том, что если вы получите хороший ответ, вы можете принять этот ответ, установив зеленую галочку слева от лучшего ответа.Это заработает несколько точек репутации как для человека, предоставляющего ответ (в качестве вознаграждения за помощь вам), так и за вас (за хорошую работу здесь). Позже (когда вы заработали больше очков репутации), вы можете повысить все ответы, которые вам помогли. – jfriend00

Смежные вопросы