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