2014-02-07 62 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