Javascript 控制异步循环
我有两个不同的Node.js程序 一个是Express.js服务器(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
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只是服务器的一个示例(因为它总是在运行并等待请求)。。。