【问题标题】:Questions from the synchronous node.js来自同步 node.js 的问题
【发布时间】:2015-08-18 10:14:48
【问题描述】:

我想要同步结果。
我只想通过将 5000 除以一来输入数据。
但是,由于异步上市,它正在苦苦挣扎。
我想看看java等同步语言的结果。

我想要这些结果:

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

【问题讨论】:

    标签: mysql node.js asynchronous web commit


    【解决方案1】:

    您可以在 node.js 中使用一些设计模式来运行顺序异步操作。在所有这些中,你不能运行一个紧密的循环等待某事发生——你必须让 node.js 中的单个 Javascript 线程运行并给它尽可能多的循环。

    手动迭代

    将一次迭代的代码放在一个本地函数中(我通常称之为next()),然后当一次迭代调用它的最后一个完成函数时,您可以再次调用next() 来开始下一次迭代。您可以通过测试某些条件来完成操作,如果事情完成则不调用next(),或者next() 的第一行可以测试您是否完成。

    请参阅下面的代码示例,了解手动迭代后代码的外观。

    序列承诺

    如果您在异步操作中使用 Promise,那么您可以让链式 Promise 为您完成所有排序,就像在 p().then(f1).then(f2).then(f3) 中一样。你可以在这个答案中看到一个例子:Promises like async.each

    使用异步模块

    Async module 支持许多异步管理功能。许多人发现它非常有用——其他人更愿意使用 Promise 来解决类似的问题。在任何情况下,它都有许多不同的排序功能。例如,如果你想异步迭代一个数组,你会使用这样的东西:

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

    【讨论】:

    • @deathquin - 这回答了你的问题吗?
    • 我没有问题谢谢!
    • @deathquin - StackOverflow 上的程序是,如果您得到一个好的答案,您可以通过选中最佳答案左侧的绿色复选标记来接受该答案。这将为提供答案的人(作为他们帮助您的奖励)和您(在这里遵循良好的程序)赢得一些声誉积分。稍后(当您获得更多声望点时),您可以投票支持所有对您有帮助的答案。
    猜你喜欢
    • 2017-05-15
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2015-02-19
    相关资源
    最近更新 更多