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
, 내가 무엇을 생각
어쨌든 여기에 몇 가지 의사 코드입니다 잘못하고있는거야? 감사!
포인터 주셔서 감사합니다. 불행히도 각 시리즈로 전환하는 것은 도움이되지 않습니다. 각 시리즈 iterator 내부의 waterfall 함수는 연속적이지 않고 병렬로 실행됩니다. –
오, 알겠습니다. 'eachCallback'을 최종 폭포 함수 (폭포 배열이 아님) 안에 넣으십시오. 나는 아직도 당신이'각 시리즈'를 원할 것이라고 생각한다. 당신은 말하기를, "각각은 폭포가 완성 될 때 끝난다". – clay
아 - 그랬어! 이제는 완전히 이해가됩니다. 감사! –