我有一个快速的js服务器,它侦听用户的请求:
// PUG template
$("#request").click(()=>{
$.ajax({url: "/launch", method: 'get'});
})
// server.js
app.get('/launch', (req, res) => {
getCatalog();
}
这应该启动一个巨大功能,它实际上可以工作数小时,除非用户希望取消它。
问题:应用户要求启动和取消此功能的正确方法是什么?
// PUG template
$("#cancel").click(()=>{
...
})
答案 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'});
})