Ich habe zwei verschiedene Node.js-Programme.Steuern Sie die Async-Schleife
Einer ist ein Express.js Server (PROGRAM1
), der die Benutzeroberfläche und RESTful APIs bereitstellen soll.
Der andere ist ein Crawler (PROGRAM2
), der Artikel weiterlesen, aus dem Internet herunterladen und alles in der Datenbank speichern. Übrigens verwende ich die Array.prototype.reduce()
und Promise
, um die Dateien zu iterieren und I/Os nacheinander zu behandeln.
Eine Sache, die ich hier tun möchte, ist, den Fortschritt des Crawlers (PROGRAM2
) von der PROGRAM1
zu überwachen und zu steuern.
Aber ich fand es sehr kompliziert.
// 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()
ist nur ein Beispiel (z. Eigentlich ist es ein Server, und der Zustand kann durch die Anforderungen von PROGRAM1
geändert werden). Durch Setzen der flag
als STOP
wird die Schleife in handleBatch()
die Änderung entdecken und Exception
werfen, dann wird das Programm angehalten.
Allerdings mag ich diesen Weg einfach nicht, weil er zu hässlich aussieht und den Prozess kontrolliert, indem er Fehler wirft. Also suche ich nach einer besseren Möglichkeit, den Loop zu kontrollieren und zu überwachen. Irgendeine Idee?
Eigentlich ist 'main()' nur die Simulation eines Servers. Ich will nicht den Prozess zu töten, und ich will nur pausiert und in der Lage sein, durch Signal neu zu starten ... – ppn029012