Как написать общий откат или останов в функции

Я думаю, что это происходит из-за того, что вы запускаете его в режиме источника с точкой

. myscript.sh

. Вы должны запустить это в подоболочке:

/full/path/to/script/myscript.sh

'source' http://ss64.com/bash/source.html

0
задан Bergi 27 February 2019 в 19:10
поделиться

3 ответа

Вбрасывание ошибки на самом деле звучит хорошо, что можно сделать довольно элегантно:

 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();
0
ответ дан Jonas Wilms 27 February 2019 в 19:10
поделиться

Давайте разберемся с этим:

Отмена обещания Этот существует . Для добавления поддержки для .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, обновить состояние, чтобы оно соответствовало начальному состоянию. Но «откат» не является предопределенной вещью, которая может иметь встроенную поддержку, в отличие от баз данных, где откат имеет довольно хорошее определение.

0
ответ дан Kousha 27 February 2019 в 19:10
поделиться

Нет, то, что вы ищете, невозможно. Не существует абстракции «задача», которая явно скрывает что-либо, и вы не можете прерывать произвольные функции. Они должны явно отказаться от отмены (например, проверив breakpoint, который им передан, как в ответе Джонаса). Вы можете сделать это, используя дочерний процесс, который вы можете убить, но это может оставить несовместимое состояние.

0
ответ дан Bergi 27 February 2019 в 19:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: