如何根据用户请求启动/取消快速表达的功能

时间:2019-07-11 14:41:17

标签: node.js express

我有一个快速的js服务器,它侦听用户的请求:

// PUG template

$("#request").click(()=>{
  $.ajax({url: "/launch", method: 'get'});
})
// server.js

app.get('/launch', (req, res) => {
    getCatalog();
}

这应该启动一个巨大功能,它实际上可以工作数小时,除非用户希望取消它。

问题:应用户要求启动和取消此功能的正确方法是什么?

// PUG template

$("#cancel").click(()=>{
  ...
})

2 个答案:

答案 0 :(得分:0)

我会使用除表达功能以外的代码逻辑来处理这种情况。 您可以创建一个用于处理目录加载的类,并为该过程提供一个状态,您可以打开和关闭该状态(我相信加载过程涉及多个异步函数调用,因此事件循环允许这样做)。 例如:

class CatalogLoader {
    constructor() {
        this.isProcessing = false
    }

    getCatalog() {
        this.isProcessing = true
        while(... && this.isProcessing) {
            // Huge loading logic 
        }
                this.isProcessing = false
        }
}

在快递中,您可以在api下方添加:

app.get('/launch', (req, res) => {
    catalogLoader.getCatalog();
}

app.get('/cancelLaunch', (req, res) => {
    catalogLoader.isProcessing = false
    ...
}

答案 1 :(得分:0)

使用require('child_process');的第二种可能的解决方案,但是您需要知道要取消的进程的PID。好处:从繁重的任务中卸载主节点线程。

因此,包括节点的const childProcess = require('child_process');

然后:

app.get('/launch', (req,res) => {
    const getCatalog = childProcess.fork('script.js', null, {
        detached: true
    });
    res.send();
});

app.get('/kill', (req,res,next) => {
    const pid = req.query.pid;
    if (pid) {
        process.kill(pid);
        res.send();
    } else {
        res.end();
    }
});


$("#requestCancel").click(()=>{
  $.ajax({url: "/kill?pid=variable*", method: 'get'});
})