2014-10-23 2 views
0

mysql과 함께 async를 사용하여 제어 흐름 문제가 발생하여 도움/조언이 도움이됩니다. 기본적으로 항목 배열이 있습니다. 배열을 반복하고 각 항목에 대해 MySQL 데이터베이스/테이블에 있는지 확인합니다. 항목이 없으면 항목을 저장하고 그렇지 않으면 저장하십시오. 따라서 전체 유스 케이스는 동기식입니다. 내가 한 일은 async.each 안에 async.waterfall을 중첩시키는 것입니다. async.each는 배열의 각 항목을 반복하고 폭포는 각 항목에 대해 (인수로 전달 된 데이터를 사용하여) 함수를 연속적으로 실행합니다. 그러나 각 항목에 대해 각 기능이 실행 중이고 다음 항목이 다시 실행됩니다. 정확히 내가 원하는 건 아니야.nodejs, async, waterfall, each 및 mysql을 사용하여 동기화 제어 흐름

var async = require('async'); 
// Assume that connection established to mysql db using mysql module 
var testArray = [1,2,3,4]; 
var eachCounter = 0; 
async.each(testArray, function(item,eachCallback){ 
    async.waterfall([ 
    function(callback){ 
     var formattedItem = item + ' some_formatting'; 
     console.log(item + ' > ' + formattedItem); 
     callback(null, formattedItem); 
    }, 
    function(arg1, callback){ 
     // Using connection.query here to see if formattedItem exists in a table 
     var mysqlRows = 0; 
     if(mysqlRows === 0) { 
      console.log(arg1 + ' does not exist so save it'); 
      var insertQuery = 'INSERT INTO ...'; 
      callback(null, insertQuery, arg1); 
     } 
     else if(mysqlRows > 0) { 
      console.log(arg1 + ' does exist so don\'t save it'); 
      callback(null, null, arg1); 
     } 
    }, 
    function(arg1, arg2, callback){ 
     if(arg1 !== null) { 
      console.log(arg2 + ' was inserted into mysql table'); 
      callback(null, 'done'); 
     } 
     else { 
      console.log(arg2 + ' was not inserted into mysql table'); 
      callback(null, 'done'); 
     } 
    } 
    ], function (err, result) { 
     eachCounter++; 
     if(eachCounter === testArray.length) { 
      console.log('really done'); 
     } 
    }); 
    eachCallback(); 
}, function(err){ 
    if(err) { 
     console.log('failed'); 
    } 
    else { 
     console.log('success') 
    } 
}); 

결과는 다음과 같습니다 :

success 
1 > 1 some_formatting 
2 > 2 some_formatting 
3 > 3 some_formatting 
4 > 4 some_formatting 
1 some_formatting does not exist so save it 
2 some_formatting does not exist so save it 
3 some_formatting does not exist so save it 
4 some_formatting does not exist so save it 
1 some_formatting was inserted into mysql table 
2 some_formatting was inserted into mysql table 
3 some_formatting was inserted into mysql table 
4 some_formatting was inserted into mysql table 
really done 

내가 정말, 정말 원하는 것은 때 : 그래서

success 
1 > 1 some_formatting 
1 some_formatting does not exist so save it 
1 some_formatting was inserted into mysql table 
2 > 2 some_formatting 
2 some_formatting does not exist so save it 
2 some_formatting was inserted into mysql table 
3 > 3 some_formatting 
3 some_formatting does not exist so save it 
3 some_formatting was inserted into mysql table 
4 > 4 some_formatting 
4 some_formatting does not exist so save it 
4 some_formatting was inserted into mysql table 
really done 

, 내가 무엇을 생각

어쨌든 여기에 몇 가지 의사 코드입니다 잘못하고있는거야? 감사!

답변

0

async.each이 병렬로 수행됩니다. 모든 전화를 연속으로 실행하려면 async.eachSeries을 사용하고 싶습니다.

+0

포인터 주셔서 감사합니다. 불행히도 각 시리즈로 전환하는 것은 도움이되지 않습니다. 각 시리즈 iterator 내부의 waterfall 함수는 연속적이지 않고 병렬로 실행됩니다. –

+0

오, 알겠습니다. 'eachCallback'을 최종 폭포 함수 (폭포 배열이 아님) 안에 넣으십시오. 나는 아직도 당신이'각 시리즈'를 원할 것이라고 생각한다. 당신은 말하기를, "각각은 폭포가 완성 될 때 끝난다". – clay

+0

아 - 그랬어! 이제는 완전히 이해가됩니다. 감사! –