我在NodeJS中的一个函数内运行一个长循环,并且知道JS本质上不允许任何东西中断函数,我想知道他们是一种暂停函数执行来监听客户端请求的方法。我目前无法做到
答案 0 :(得分:1)
执行时不能中断某个功能。你需要做的是重构导致问题的循环。
你必须打破循环本身:
setTimeout()
这就是我使用setTimeout的意思:
鉴于功能:
function syncLoop(args) {
var localVar;
for (i = 0; i < max; i++) {
doSomething(args, localVar)
}
}
将循环替换为setTimeout
(或setImmediate()
),如下所示:
function asyncLoop(args) {
var localVar;
function innerLoop(i){ if(i < max){
doSomething(args, localVar)
setTimeout(function(){
i++; innerLoop(i);
}, 0);
} }
innerLoop(0);
}
这样,在每次迭代时,控件都被传递给事件循环,并且可以提供其他独立请求。
答案 1 :(得分:0)
停止请求处理并不是一个好主意。尝试使用promises,这是一个非常粗略的例子,但你可以理解基本的想法:
...
http.createServer(function(req, res) {
let bigData = [];
//parse your big data in bigData
...
new Promise(function(resolve, reject){
for(let i = 0; i < bigData.length; i++){
//some long calculate process
//if error
return reject(error);
//if all calculated
return resolve(result);
}
})
.then(function(result){
res.end(result);
}, function(function(error){
throw error;
});
});
...
也许试试这个:
let count = 0;
for(let i = 0; i < bigData.length; i++){
/*something calculation
....
*/
count++;
//this code allow your server every 50 iterations "take a brake" and handle other requests
if(count === 50){
count = 0;
setTimeout(()=>{
}, 100);
};
};