Как запустить / отменить функцию в экспресс по запросу пользователя - PullRequest
0 голосов
/ 11 июля 2019

У меня есть экспресс-сервер js, который прослушивает запрос от пользователя:

// PUG template

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

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

Это должно запустить огромную функцию do while, которая может буквально работать часами, кроме случаев, когда пользователь хочет отменить ее.

Вопрос: каким должен быть запуск и отмена этой функции по запросу пользователя?

// PUG template

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

Ответы [ 2 ]

0 голосов
/ 15 июля 2019

Второе возможное решение с использованием 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'});
})
0 голосов
/ 15 июля 2019

Я бы подошел к этому случаю с помощью логики кода, отличной от экспресс-функциональности.Вы можете создать класс, который будет обрабатывать загрузку каталога, а также иметь состояние для этого процесса, которое вы можете включать и выключать (я полагаю, что процесс загрузки включает в себя вызовы нескольких асинхронных функций, поэтому цикл обработки событий это позволяет).Например:

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
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...