2015-08-18 94 views
-4

我想要同步結果。
我只想通過將5000除以1來輸入數據。
但是,由於異步上市,它正在掙扎。
我想看看像Java這樣的同步語言的結果。
來自同步問題node.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中使用幾種設計模式來運行順序異步操作。在它們中,你不能運行一個緊密的循環等待發生的事情 - 你必須讓node.js中的單個Javascript線程運行,並儘可能多地給它一個循環。

手冊迭代

把代碼在本地功能的迭代(我通常稱它爲next()),然後當一個反覆調用其去年完成的功能,可以再次調用next()開始下一次迭代。您可以通過測試某些條件來完成操作,如果事情已完成,則不要致電next(),或者可以測試第一行next()以查看是否完成。

請參閱下面的代碼示例,瞭解您的代碼在手動迭代時的外觀。

序列承諾

如果您使用的承諾爲您的異步操作,那麼你就可以讓鏈式承諾爲您做的所有排序爲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