두 개의 다른 Node.js 프로그램이 있습니다.비동기 루프 제어
하나는 Express.js 서버 (PROGRAM1
)로 사용자 인터페이스와 RESTful API를 제공합니다.
다른 하나는 크롤러 (PROGRAM2
)로, 항목을 계속 읽고 웹에서 다운로드하여 모든 것을 데이터베이스에 저장합니다. 그런데 Array.prototype.reduce()
과 Promise
을 사용하여 파일을 반복하고 입출력을 순서대로 처리합니다.
내가 여기에서하고자하는 한 가지 점은 PROGRAM1
에서 크롤러 (PROGRAM2
)의 진행 상태를 모니터링하고 제어하는 것입니다.
그러나 나는 그것이 매우 복잡하다는 것을 알았습니다.
// Control the loop by this `flag`, the value can be assigned from outside
var flag = "IDLE";
// The outside can read this `index`, and monitor the progress
var current_index = -1;
var PAGE_SIZE = 100;
function handleBatch(index){
var defer = q.defer();
// Mongoose statement to find documents...
Book.find()
.skip(index*PAGE_SIZE).limit(PAGE_SIZE).then(function(books){
var finished = 0;
for(var i=0; i<books.length; i++){
var book = books[i];
downloadInfo(book).then(function(bookInfo){
if(flag === "STOP")
defer.reject(new Error("The loop should stop!"));
//store the info...
finished ++;
if(finished === PAGE_SIZE)
defer.resolve();
});
}
});
return defer.promise;
}
var promiseHandler;
function main(){
while(true){
if(flag === "IDLE")
continue;
else if(flag === "START"){
var [0,1,2,3,4,5...,2500].reduce(function(lastPromise, nextIndex){
promiseHandler = lastPromise.then(function(){
currentIndex = nextIndex;
});
}, q());
}else if(flag === "STOP"){
promiseHandler.then(null, function(err){
flag = "IDLE";
});
}
}
}
main()
단지 예 (예를 들어이. 실제로 서버, 그리고 상태 PROGRAM1
의 요청에 의해 변경 될 수 있음)이다. flag
을 STOP
으로 설정하면 handleBatch()
의 루프가 변경 사항을 발견하고 Exception
을 던집니다. 그러면 프로그램이 일시 중지됩니다.
그러나 나는 너무 추한 것처럼 보이고 오류를 던져서 프로세스를 제어하기 때문에이 방법을 좋아하지 않습니다. 그래서 루프를 제어하고 모니터하는 더 나은 방법을 찾고 있습니다. 어떤 생각이라도?
사실'main()'은 단지 서버의 시뮬레이션 일뿐입니다. 내가 프로세스를 죽이고 싶지 않아 난 그냥 일시 중지하고 신호로 다시 시작할 수 ... – ppn029012