2016-10-04 2 views
1

У меня есть две различные программы 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, тогда программа будет приостановлена.

Однако мне просто не нравится этот путь, потому что он выглядит слишком уродливым и контролирует процесс, бросая ошибки. Поэтому я ищу лучший способ контролировать и контролировать цикл. Любая идея?

ответ

0

Вы должны посмотреть в документации для node.js 'process. И чтобы ответить на ваш вопрос об остановке выполнения, здесь ->

process.exit (0);

Как подсказка: не управляйте своей программой с помощью петли. Это плохо.

+0

На самом деле 'main()' это просто симуляция сервера. Я не хочу убивать процесс, и я просто хочу, чтобы он приостановился и смог перезапустить по сигналу ... – ppn029012

0

По его звучанию вы после реализации способа взаимодействия между процессами в узле js. Это широкая тема программирования, выходящая за пределы узла js. Существует много шаблонов и средств для достижения этого, но один из моих фаворитов - использовать очередь сообщений, чтобы свободно связывать два процесса.

На узле js мы имеем такие вещи, как Redis и node-redis, которые могут быть использованы для реализации шаблона публикации-подписки. Конечно, есть много библиотек сообщений, которые тоже будут работать.

В вашем случае Express API может опубликовать событие «пауза», и искатель может подписаться на это событие и предпринять некоторые действия. Затем ваши узловые приложения остаются асинхронными (нет (правда) глупостей!).

+0

В основном проблема заключается в том, как управлять циклом асинхронизации, запускать/приостанавливать/перезапускать задачу, а не межпроцессная коммуникация. – ppn029012

+0

Вы описываете проблему как имеющую 2 программы, которые должны общаться - это межпроцессное общение. Если вы хотите передать управляющий сигнал с помощью программы, вы бы не использовали функцию обратного вызова? while (true) будет использовать весь опрос ЦП для изменения переменной - это не то, как вы программируете в javascript, вот как вы пишете (плохой) синхронный C. – saille

+0

Я вижу, PROGRAM2 - всего лишь пример сервера (так как это всегда запускается и ждет запроса) ... – ppn029012

Смежные вопросы