Я думаю, что это происходит из-за того, что вы запускаете его в режиме источника с точкой
. myscript.sh
. Вы должны запустить это в подоболочке:
/full/path/to/script/myscript.sh
'source' http://ss64.com/bash/source.html
Вбрасывание ошибки на самом деле звучит хорошо, что можно сделать довольно элегантно:
const cancellable = fn => (...args) => {
let cancel = false;
const breakpoint = () => {
if(cancel) throw new Error("Cancelation");
};
return {
result: fn(breakpoint, ...args).catch(console.log),
stop() { cancel = true; },
};
};
Это можно использовать как:
const doSomeStuff = cancellable(async function doSomeStuff(breakpoint) {
await aLongTask();
breakpoint();
await anotherBigOldTask();
breakpoint();
await bigNestedTaskThatTakesForever();
return "Done";
});
let task = doSomeStuff();
task.stop();
Давайте разберемся с этим:
Отмена обещания Этот существует . Для добавления поддержки для .cancel
вам понадобится полифилл, который при вызове отменит выполнение Обещания. Вы можете прочитать больше об этом здесь . Как только вы установите полифилл, ваше обещание будет иметь .cancel
, поэтому вы можете иметь:
const doSomeStuff = () => {
return new Promise(resolve => {
...
})
}
let prmise = null;
const watcher = chokidar.watch(watchURLs, {
ignored: /\.git/,
ignoreInitial: true,
persistent: true,
ignorePermissionErrors: true,
atomic: 500,
});
watcher.on('all', (event, filePath) => {
promise = doSomeStuff();
});
watcher.on('change', () => {
promise && promise.cancel()
});
Роллбар Этот не существует . Вы должны реализовать это самостоятельно. Может быть, сделать снимок состояния в самом начале doSomeStuff
, а затем, если вызвано .cancel
, обновить состояние, чтобы оно соответствовало начальному состоянию. Но «откат» не является предопределенной вещью, которая может иметь встроенную поддержку, в отличие от баз данных, где откат имеет довольно хорошее определение.
Нет, то, что вы ищете, невозможно. Не существует абстракции «задача», которая явно скрывает что-либо, и вы не можете прерывать произвольные функции. Они должны явно отказаться от отмены (например, проверив breakpoint
, который им передан, как в ответе Джонаса). Вы можете сделать это, используя дочерний процесс, который вы можете убить, но это может оставить несовместимое состояние.