2014-02-07 63 views
0

我需要在一個循環中執行一系列MySQL插入,然後在完成所有事情後執行一些操作。不過,我不知道在哪裏回調 -MySQL查詢沒有被順序執行(NodeJS)

for (var q=0; q<things.length; q++) 
{ 

thing 
    .create({ 
     active_time: time 
     rule: rule 
     next: next_object, 
     percentage: object.percent, 
     enabled: 1, 
    }) 
    .complete(function(err, newSchedule) { 
     console.log('thing added successfully'); 

    }) 

} 

我不能把它放在。 complete部分,因爲它需要發生在所有人之後。我如何確保在繼續之前全部完成?

編輯:我已經開始使用AsyncJS,但似乎MySQL的查詢將在它們完成前回調。下面是新的代碼:

if (valid) { 

     async.each(arrayOfObjects, tools.submitThing, function() 
     { 
      console.log("finished submissions") 
     }); 

exports.submitThing = function(thingObject, callback) { 

    thing 
    .create({ 
     active_time: time 
     rule: rule 
     next: next_object, 
     percentage: object.percent, 
     enabled: 1, 
    }) 
    .complete(function(err, newSchedule) { 
     console.log('thing added successfully'); 

    }) 

    callback(); 

} 

服務器控制檯顯示消息「提交填寫完整的」 MySQL的插入之前寄存器。任何方式來解決這個問題?

回答

0

你想要的是一個異步控制流庫來處理依次執行一個異步函數循環。

查看async npm模塊(docs),尤其是async.eachSeries函數。這樣可以循環遍歷所有的things和每個thing,逐個運行創建查詢。當他們全部完成插入時,您將在最後有一個最終回調函數。

+0

我試過了,但在我看來,MySQL查詢會立即開始操作和回調,即使它們還沒有完成。是這樣嗎? – erythraios

+0

在'.complete'函數內部調用'callback()'而不是在外部,那麼你應該很好。 '.complete(函數(ERR,newSchedule){ \t的console.log( '成功添加的東西'); \t回調();} ' – pauljz

+0

感謝你,沒有的伎倆! – erythraios