← Cloudflare Workflows / workflows / build
Контекст шага
Каждый step.do обратный вызов получает объект контекста (WorkflowStepContext) в качестве первого аргумента. Этот контекст предоставляет коду шага информацию времени выполнения о самом шаге, текущей попытке повтора и итоговой конфигурации этого шага.
WorkflowStepContext
type WorkflowStepContext = {
step: {
name: string;
count: number;
};
attempt: number;
config: WorkflowStepConfig;
};Свойства
| Свойство | Тип | Описание |
|---|---|---|
step.name |
string |
Имя, которое вы передали в step.do. |
step.count |
number |
Сколько раз step.do был вызван с этим именем в текущем запуске Workflow. Начинается с 1 для первого вызова с данным именем. |
attempt |
number |
Номер текущей попытки (отсчёт начинается с 1). 1 при первой попытке, 2 при первой повторной попытке, и так далее. |
config |
WorkflowStepConfig |
Итоговая конфигурация повторных попыток и тайм-аута для этого шага, включая значения по умолчанию, применённые средой выполнения. |
Если в конфигурации шага retries.delay является функцией, динамическая задержка не отображается в ctx.config.retries.delay. Функция delay получает собственный объект контекста с текущим контекстом шага и ошибкой, вызвавшей повтор.
Доступ к контексту
Передайте параметр в step.do обратный вызов для получения объекта контекста:
await step.do("my-step", async (ctx) => {
console.log(ctx.step.name); // "my-step"
console.log(ctx.step.count); // 1
console.log(ctx.attempt); // 1 on first try, 2 on first retry, etc.
console.log(ctx.config); // { retries: { limit: 5, ... }, timeout: "10 minutes" }
});Контекст также доступен, если вы передаёте собственный WorkflowStepConfig:
await step.do(
"call an API",
{
retries: {
limit: 10,
delay: "10 seconds",
backoff: "exponential",
},
timeout: "30 minutes",
},
async (ctx) => {
console.log(ctx.config.retries.limit); // 10
console.log(ctx.config.timeout); // "30 minutes"
},
);Чтобы настроить функции задержки, обратитесь к Настройка динамической задержки повтора.
Примеры
Настройка поведения в зависимости от попытки повтора
Используйте ctx.attempt чтобы изменить поведение шага при повторных попытках. Например, можно использовать резервный эндпоинт после определённого числа повторных попыток:
await step.do(
"fetch data",
{ retries: { limit: 5, delay: "5 seconds", backoff: "linear" } },
async (ctx) => {
const url =
ctx.attempt <= 3
? "https://api.example.com/primary"
: "https://api.example.com/fallback";
const response = await fetch(url);
if (!response.ok) {
throw new Error(`Request failed with status ${response.status}`);
}
return await response.json();
},
);Логируйте метаданные шагов для обеспечения наблюдаемости
Используйте ctx.step чтобы добавить структурированные метаданные в журналы:
await step.do("process-order", async (ctx) => {
console.log(
JSON.stringify({
step: ctx.step.name,
stepCount: ctx.step.count,
attempt: ctx.attempt,
retryLimit: ctx.config.retries?.limit,
}),
);
// Your step logic here
});