gpt4 book ai didi

javascript - 控制异步循环

转载 作者:行者123 更新时间:2023-11-28 05:29:15 25 4
gpt4 key购买 nike

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

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

另一个是爬虫(PROGRAM2),它不断读取项目,从网络下载它并将所有内容存储到数据库中。顺便说一句,我正在使用 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";
});
}
}
}

main() 只是一个例子(例如,实际上它是一个服务器,状态可以通过来自 PROGRAM1 的请求来改变)。通过将flag设置为STOPhandleBatch()中的循环将发现更改并抛出Exception,然后程序将暂停。

但是,我就是不喜欢这种方式,因为它看起来太丑陋并且通过抛出错误来控制进程。所以我正在寻找一种更好的方法来控制和监视循环。有人有什么想法吗?

最佳答案

您应该查看 Node.js 的文档 process 。要回答有关停止执行的问题,请在此处 ->

process.exit(0);

作为提示:不要使用循环来控制程序。太糟糕了。

关于javascript - 控制异步循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39859533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com