Справочник
Каждый член контекста 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, что бы тело ни делало дальше. |
Отмена |