Редактировать:
Отвечая на ваши изменения. Теперь я вижу намерение. Если он работает в nodejs, вы можете использовать для этого значение worker_thread https://nodejs.org/api/worker_threads.html#worker_threads_worker_workerdata.
Например:
// main.js
const runCode = (code) => {
const worker = new Worker("./code-executor.js", { workerData: { code: guestCode } });
const promise = new Promise((resolve) => {
setTimeout(() => worker.kill(), 60000 * 5);
worker.on("error", () => {
return reject(new SomeCustomError())
});
worker.on("message", (message) => {
if(message.success) return resolve(message.result);
return reject(new Error(message.error));
});
});
promise.finally(() => { worker.kill() });
return promise;
}
// code-executor.js
const { workerData, parentPort } = require("worker_threads");
const { code } = workerData;
Promise.resolve()
.then(() => (new Function(fcode))())
.then((result) => {
parentPort.postMessage({
success: true,
result: value
})
})
.catch((error) => {
parentPort.postMessage({
success: true,
error: error.message
})
});
Если оно в браузере https://developer.mozilla.org/en-US/docs/Web/API/Worker WebAPI не совсем такой же, но логика c должна быть похожа
Оригинал
Уничтожение процесса. Также прочитайте: https://nodejs.org/api/process.html#process_signal_events
process.kill(pid, "SIGINT")
«Убивая» функцию длительного выполнения, вам нужно немного взломать. Там нет элегантного решения. Введите контроллер, который может быть видоизменен за пределами функции длительного действия. Чтобы остановить его снаружи, установите controller.isStopped = true
export const STOP_EXECUTION = Symbol();
function longRunning(controller){
... codes
// add stopping point
if(controller.isStopped) throw STOP_EXECUTION;
... codes
// add stopping point
if(controller.isStopped) throw STOP_EXECUTION;
... codes
}
// catch it by
try{
longRunnning();
}catch(e){
switch(true){
e === STOP_EXECUTION: ...; // the longRunning function is stopped from the outside
default: ...; // the longRunning function is throwing not because of being stopped
}
}
Суть: https://gist.github.com/Kelerchian/3824ca4ce1be390d34c5147db671cc9b