暂停一个函数来听取请求

时间:2017-05-24 11:26:26

标签: javascript node.js

我在NodeJS中的一个函数内运行一个长循环,并且知道JS本质上不允许任何东西中断函数,我想知道他们是一种暂停函数执行来监听客户端请求的方法。我目前无法做到

2 个答案:

答案 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);
    };

};