Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 控制异步循环_Javascript_Node.js_Mongodb_Express - Fatal编程技术网

Javascript 控制异步循环

Javascript 控制异步循环,javascript,node.js,mongodb,express,Javascript,Node.js,Mongodb,Express,我有两个不同的Node.js程序 一个是Express.js服务器(PROGRAM1),它提供用户界面和RESTful API 另一个是爬虫(PROGRAM2),它不断地读取项目,从web下载并将所有内容存储到数据库中。顺便说一句,我正在使用Array.prototype.reduce()和Promise迭代文件并依次处理I/O 这里我想做的一件事是从PROGRAM1监视和控制爬虫程序(PROGRAM2)的进度 但我发现这很复杂 // Control the loop by this `flag

我有两个不同的Node.js程序

一个是Express.js服务器(
PROGRAM1
),它提供用户界面和RESTful API

另一个是爬虫(
PROGRAM2
),它不断地读取项目,从web下载并将所有内容存储到数据库中。顺便说一句,我正在使用
Array.prototype.reduce()
Promise
迭代文件并依次处理I/O

这里我想做的一件事是从
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";                     
             });
       }
   }      
}
//通过此“标志”控制循环,可以从外部分配值
var flag=“空闲”;
//外部可以读取此“索引”,并监视进度
var当前_指数=-1;
变量页大小=100;
功能车把套(索引){
var defer=q.defer();
//Mongoose语句以查找文档。。。
找书
.skip(索引*页面大小)。limit(页面大小)。然后(函数(书籍){
var=0;

对于(var i=0;i,您应该查看node.js'的文档。 要回答您关于停止执行的问题,请点击这里->

进程退出(0)


提示:不要使用循环控制程序。这很糟糕。

您应该查看node.js的文档。 要回答您关于停止执行的问题,请点击这里->

进程退出(0)


作为提示:不要使用循环控制程序。这很糟糕。

听上去,您正在寻找一种在node js中实现进程间通信的方法。这是一个广泛的编程主题,远远超出node js。实现这一点有很多模式和方法,但我最喜欢的方法之一是使用消息队列进行松散耦合这两个过程

在NodeJS上,我们可以使用和来实现发布-订阅模式。当然,也有许多消息传递库可以工作


在您的情况下,Express API可能会发布一个“暂停”事件,爬虫程序可以订阅该事件并采取一些操作。然后,您的节点应用程序将保持异步(没有while(真的)胡说八道!).

听上去,您正在寻找一种在node js中实现进程间通信的方法。这是一个超越node js的广泛编程主题。实现这一点有很多模式和方法,但我最喜欢的方法之一是使用消息队列将两个进程松散耦合

在NodeJS上,我们可以使用和来实现发布-订阅模式。当然,也有许多消息传递库可以工作


在您的情况下,Express API可能会发布一个“暂停”事件,爬虫程序可以订阅该事件并采取一些操作。然后,您的节点应用程序将保持异步(无while(true)胡说八道!)。

实际上是
main()
只是对服务器的模拟。我不想终止进程,我只希望它暂停并能够通过信号重新启动…实际上是
main()
只是模拟服务器。我不想终止进程,我只希望它暂停并能够通过信号重新启动…问题主要集中在如何控制异步循环、启动/暂停/重新启动任务,而不是进程间通信。您将问题描述为有两个程序需要通信-t这就是进程间通信。如果你想用一个程序传递控制信号,你不就用一个回调函数吗?虽然(true)会用整个CPU轮询一个变量的变化——这不是你用javascript编程的方式,这就是你编写(糟糕的)同步C的方式。我明白了,PROGRAM2只是服务器的一个例子(因为它总是在运行并等待请求)…问题主要集中在如何控制异步循环、启动/暂停/重新启动任务,而不是进程间通信。您将此问题描述为有两个程序需要通信-即进程间通信。如果您希望通过程序传递控制信号,您不就使用回调函数吗?虽然(true)将使用整个CPU轮询变量的更改—这不是javascript编程的方式,而是编写(糟糕的)同步C的方式。我明白了,PROGRAM2只是服务器的一个示例(因为它总是在运行并等待请求)。。。