Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.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 在node.js中停止函数,并在前端单击_Javascript_Node.js - Fatal编程技术网

Javascript 在node.js中停止函数,并在前端单击

Javascript 在node.js中停止函数,并在前端单击,javascript,node.js,Javascript,Node.js,后端有一个循环可以优化某些东西,我希望它永远持续下去,直到我点击前端的停止按钮 迄今为止我的(简化)代码: 按下按钮时,调用此函数 function optimize() { $.ajax({ type: 'GET', url: '/optimize', success: function (data) { updatePlot(data); }, }); } 在后端: let op

后端有一个循环可以优化某些东西,我希望它永远持续下去,直到我点击前端的停止按钮

迄今为止我的(简化)代码:
按下按钮时,调用此函数

function optimize() {    
    $.ajax({
        type: 'GET',
        url: '/optimize',
        success: function (data) {
            updatePlot(data);
        },
    });
}
在后端:

let optimizingFunction = {};

router.get('/optimize', function (req, res) {
    optimizeFunction(); //This goes on for a long time...
    res.send(optimizingFunction);
});

function optimizeFunction(){
    while(true){
        let betterFunction = {};
        //...
        optimizingFunction = betterFunction;
    }
}
那么现在我如何在按下另一个按钮时停止此功能并获得当前的optimizingFunction值呢我试过: 单击“停止”按钮

function stop() {    
    $.ajax({
        type: 'GET',
        url: '/stop'
    });
}
后端:

router.get('/stop', function (req, res) {
    process.exit(1);
});
我注意到它实际上执行了stop函数,但在执行了第一个函数之后…

对于这样的问题,什么是简单的“最佳实践”方法?

因此,有很多不同的方法来解决这个问题。基于您的示例,最简单的方法可能是使用setTimeout而不是循环,然后在决定重置超时之前测试某种变量。类似这样(未经测试):

但是,请注意,这是次优的,并且不具有很强的可扩展性。更好的解决方案是使用某种工作队列或数据库。另外,您通常不希望使用GET请求更改应用程序状态,而是使用POST或PUT

在此处添加一个更传统的HTTP模式来完成此类工作:

const app = express(); 
const currentState = {}; // this *really* should be in a database for any nontrivial application.

function process() {
  // do work to add properties & values to currentState
  if(app.enabled('continue work')) {
    setTimeout(process, 1000); // run every second.  Could set that to smaller intervals
  }
}

app.post('/start', (req, res) => {
  app.enable('continue work');
  process();
  res.sendStatus(200);
});

app.get('/state', (req, res) => {
  res.send({ state: currentState, processing: app.get('continue work') });
});

app.post('/stop', (req, res) => {
  app.disable('continue work');
  res.send(currentState);
});

注意,很多人不喜欢URL作为“动作”(开始、停止等),但这主要是他们的偏好。如果您愿意的话,请查看有关RESTAPI的文章,了解该方法是什么样子的

所以,有很多不同的方法可以做到这一点。基于您的示例,最简单的方法可能是使用setTimeout而不是循环,然后在决定重置超时之前测试某种变量。类似这样(未经测试):

但是,请注意,这是次优的,并且不具有很强的可扩展性。更好的解决方案是使用某种工作队列或数据库。另外,您通常不希望使用GET请求更改应用程序状态,而是使用POST或PUT

在此处添加一个更传统的HTTP模式来完成此类工作:

const app = express(); 
const currentState = {}; // this *really* should be in a database for any nontrivial application.

function process() {
  // do work to add properties & values to currentState
  if(app.enabled('continue work')) {
    setTimeout(process, 1000); // run every second.  Could set that to smaller intervals
  }
}

app.post('/start', (req, res) => {
  app.enable('continue work');
  process();
  res.sendStatus(200);
});

app.get('/state', (req, res) => {
  res.send({ state: currentState, processing: app.get('continue work') });
});

app.post('/stop', (req, res) => {
  app.disable('continue work');
  res.send(currentState);
});

注意,很多人不喜欢URL作为“动作”(开始、停止等),但这主要是他们的偏好。如果您愿意的话,请查看有关RESTAPI的文章,了解该方法是什么样子的

仅用于停止函数的工作队列或数据库??天哪,我希望可以做得简单得多:(不确定超时时间,但谢谢-我现在就试试这个!:@Cold_Class哦,这取决于你实际在做什么。如果您可以在一个节点进程中完成所有工作,这就足够了。如果您需要使用多个,那么它不是共享内存空间,因此您必须引入其他内容来跟踪状态。哦,我注意到返回到前端的对象不是当前对象…如何在每次运行process()函数后发送它?您不能,至少在Ajax中不能。HTTP仅限于每个请求一个响应。如果您需要发送来自服务器的信息,请查看web套接字。感谢流行词web套接字,我将查看它-但现在仅获取最新状态就足够了。所以我会等到停止后再发送这样的响应<代码>如果(!app.enabled('continue work'))res.send(optimizingFunction)仅用于停止函数的工作队列或数据库??天哪,我希望可以做得简单得多:(不确定超时时间,但谢谢-我现在就试试这个!:@Cold_Class哦,这取决于你实际在做什么。如果您可以在一个节点进程中完成所有工作,这就足够了。如果您需要使用多个,那么它不是共享内存空间,因此您必须引入其他内容来跟踪状态。哦,我注意到返回到前端的对象不是当前对象…如何在每次运行process()函数后发送它?您不能,至少在Ajax中不能。HTTP仅限于每个请求一个响应。如果您需要发送来自服务器的信息,请查看web套接字。感谢流行词web套接字,我将查看它-但现在仅获取最新状态就足够了。所以我会等到停止后再发送这样的响应<代码>如果(!app.enabled('continue work'))res.send(optimizingFunction)