У меня есть две различные программы Node.js.Управление асинхронной петлей
Один из них - это сервер Express.js (PROGRAM1
), который предназначен для предоставления пользовательского интерфейса и API RESTful.
Другой - искатель (PROGRAM2
), который продолжает читать элемент, загружать его из Интернета и хранить все в базе данных. Кстати, я использую Array.prototype.reduce()
и Promise
для поочередного итерации файлов и обработки операций ввода-вывода.
Одна вещь, которую я хотел бы здесь сделать, - следить и следить за ходом гусеничного ходунки (PROGRAM2
) от PROGRAM1
.
Но я нашел это очень сложным.
// 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