Run.cancel()
The .cancel() method cancels a workflow run, stopping execution and cleaning up resources.
This method aborts any running steps and updates the workflow status to 'canceled'. It works for both actively running workflows and suspended/waiting workflows.
Usage exampleDirect link to Usage example
const run = await workflow.createRun()
await run.cancel()
ParametersDirect link to Parameters
No parameters:
void
This method takes no parameters
ReturnsDirect link to Returns
result:
Promise<void>
A promise that resolves once cancellation is requested and, if storage is configured, the status update to canceled has been attempted. It does not wait for running steps to stop. Calling cancel() on a run that already finished leaves its status unchanged, except with the Inngest engine.
How cancellation worksDirect link to How cancellation works
When called, the workflow will:
- Trigger the abort signal - Uses the standard Web API AbortSignal to notify running steps
- Prevent subsequent steps - No further steps will be executed
Abort signal behaviorDirect link to Abort signal behavior
Steps that check the abortSignal parameter can respond to cancellation:
- Steps can listen to the 'abort' event:
abortSignal.addEventListener('abort', callback) - Steps can check if already aborted:
if (abortSignal.aborted) { ... } - Useful for cancelling timeouts, network requests, or long-running operations
Steps must actively check the abort signal to be canceled mid-execution; otherwise, the current step runs to completion and subsequent steps don't execute.
Extended usage examplesDirect link to Extended usage examples
Cancelling a workflow on errorDirect link to Cancelling a workflow on error
const run = await workflow.createRun()
try {
const result = await run.start({ inputData: { value: 'initial data' } })
} catch (error) {
await run.cancel()
}
Creating a step that responds to cancellationDirect link to Creating a step that responds to cancellation
const step = createStep({
id: 'long-running-step',
execute: async ({ inputData, abortSignal, abort }) => {
const timeout = new Promise(resolve => {
const timer = setTimeout(() => resolve('done'), 10000)
// Clean up if canceled
abortSignal.addEventListener('abort', () => {
clearTimeout(timer)
resolve('canceled')
})
})
const result = await timeout
// Check if aborted after async operation
if (abortSignal.aborted) {
return abort() // Stop execution
}
return { result }
},
})