2つの異なるNode.jsプログラムがあります。非同期ループを制御する
1つはExpress.jsサーバー(PROGRAM1
)で、ユーザーインターフェイスとRESTful APIを提供します。
もう1つはクローラ(PROGRAM2
)です。これはアイテムの読み取りを続け、Webからダウンロードしてすべてをデータベースに格納します。ちなみに、私はArray.prototype.reduce()
とPromise
を使って、ファイルを繰り返し処理し、I/Oを順番に処理しています。
私がここでやりたいことの1つは、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()'は単なるサーバのシミュレーションです。私はプロセスをkillしたくないので、それを一時停止してシグナルで再起動できるようにしたい。 – ppn029012