Перейти к содержимому

Справочник

Каждый член контекста ctx и то, что он делает у отменённой задачи, и четыре слова, которыми остальные страницы async_job говорят об ошибках и отмене.

Что делает каждый член ctx, как он ведёт себя в уже отменённой задаче и что с ним делает отмена, пришедшая, пока он работает:

Член Что делает Задача уже отменена Отмена пришла, пока он работает
ctx.check() Голая контрольная точка Бросает Cancelled
ctx.join(action) Ждёт действие целиком Бросает Cancelled Ждёт, потом бросает
ctx.abandonable(action) Ждёт, пока жива задача Бросает Cancelled Бросает сразу
ctx.uncancellable(action) Придерживает отмену Бросает Cancelled Держит её до конца шага
ctx.pause(duration) Даёт пройти времени Бросает Cancelled Прерывается и бросает
ctx.child(body) Делает ребёнка для запуска Работает как обычно
ctx.run(child) Запускает ребёнка и ждёт Бросает Cancelled Передаёт её, ждёт, бросает
ctx.start(child) Запускает ребёнка, не ждёт Бросает Cancelled Передаёт её
ctx.runAll(children) Запускает детей бок о бок Бросает Cancelled Передаёт её, ждёт, бросает
ctx.each(stream, onData) Следует за стримом в ребёнке Бросает Cancelled Передаёт её
ctx.onCancel(callback) Зовёт колбэк при отмене Бросает Cancelled
ctx.onDispose(disposer) Убирает в конце Работает как обычно
ctx.onDiscard(disposer) Убирает, если не Done Работает как обычно
ctx.disown(value) Снимает уборку значения Работает как обычно
ctx.unattended(action) Запускает работу, которую никто не ждёт Работает как обычно Не отменяется
ctx.log(message) Передаёт сообщение наблюдателю Работает как обычно
ctx.job Задача этого контекста Работает как обычно
ctx.heldCancellation Придержанная отмена или null Работает как обычно

Чего в ячейках нет:

  • ctx.check() — контрольная точка для места, где нечего обернуть.

  • ctx.abandonable перестаёт ждать, когда задачу отменяют, а действие идёт дальше. ctx.uncancellable держит отмену до конца шага, а бросает её следующая контрольная точка.

  • ctx.child делает незапущенного ребёнка, которого примет движок задачи, для кода, у которого есть контекст, но который не знает движка: Job.deferred — ребёнок ядра, а движок, который сам владеет своими детьми, его отвергает. Он ничего не запускает и не проверяет; отказывают члены, которые запускают ребёнка.

  • ctx.run, ctx.start и ctx.runAll принимают ChildJob, например созданную через Job.deferred или ctx.child, и передают отмену своим детям. ctx.start оставляет исход своего ребёнка тому, у кого ребёнок в руках. ctx.runAll останавливает остальных, как только один ребёнок кончится не значением.

  • ctx.each отдаёт события стрима колбэку по одному.

  • ctx.onCancel вызывает колбэк, как только задача примет отмену. ctx.onDispose убирает при любом исходе. ctx.onDiscard убирает, если задача кончилась не Done, а тело, которое кончилось Done, не вернув значение, убирает его само.

  • Ошибки работы ctx.unattended идут в onError, затем к ответу.

  • Замыкание, переданное в ctx.log, вызывает наблюдатель, который строит строку.

  • ctx.heldCancellation — отмена, которую придерживает открытая секция uncancellable.

Последняя колонка верна там, где задача принимает отмену сразу, как та пришла. Внутри ctx.uncancellable и в задаче, созданной с cancellable: false, задача не принимает отмену, пока член работает, и он продолжает так, будто её не было.

Модель ошибок и отмены держат четыре слова, и смысл у каждого уже, чем в обычной речи:

Слово Что значит Страница
Наблюдать провал Читать done или value, передать провал дальше через then или вызвать ignoreFailure() не позже микрозадачи после конца задачи; чтение outcome и наблюдатель у задачи не в счёт. Исходы
Ответить за ошибку Что происходит с провалом, который никто не наблюдает, и с ошибкой, которой не несёт ни один исход: её берёт onUnanswered наблюдателя, который подмешивает JobAnswerer, а без такого наблюдателя — зона. Ошибки
Зона Зона, где задача создана; ошибка, которая до неё дошла, там неперехваченная. Ошибки
Принять отмену Задача становится отменённой: отмена передаётся её детям, вызываются её колбэки onCancel, и задача кончится Cancelled, что бы тело ни делало дальше. Отмена