remotion-dev/remotion · error · TypeError
The continueRender() method must be called with a parameter
Error message
The continueRender() method must be called with a parameter that is the return value of delayRender(). No value was passed.
What it means
continueRender() unblocks a render previously delayed by delayRender() and must be passed the numeric handle that delayRender() returned. Calling it with no argument is a programming error (almost always a forgotten return value or an unbound variable), so it throws a TypeError immediately.
Source
Thrown at packages/core/src/delay-render.ts:154
/**
* Internal function that accepts environment as parameter.
* @private
*/
type ContinueRenderInternalOptions = {
scope: DelayRenderScope;
handle: number;
environment: RemotionEnvironment;
logLevel: LogLevel;
};
export const continueRenderInternal = ({
scope,
handle,
environment,
logLevel,
}: ContinueRenderInternalOptions): void => {
if (typeof handle === 'undefined') {
throw new TypeError(
'The continueRender() method must be called with a parameter that is the return value of delayRender(). No value was passed.',
);
}
if (typeof handle !== 'number') {
throw new TypeError(
'The parameter passed into continueRender() must be the return value of delayRender() which is a number. Got: ' +
JSON.stringify(handle),
);
}
const handleExists = scope.remotion_delayRenderHandles.includes(handle);
const timeoutEntry = scope.remotion_delayRenderTimeouts[handle];
if (handleExists && environment.isRendering && timeoutEntry) {
const {label, startTime, timeout} = timeoutEntry;
clearTimeout(timeout);
const message = [
label ? `"${label}"` : 'A handle',View on GitHub (pinned to 78fe4bb3fd)
Solutions
- Always capture the handle: const handle = delayRender('label'); then continueRender(handle).
- Use the handle from the same scope that created it.
- If using useDelayRender, let the hook manage the lifecycle instead of calling continueRender manually.
Example fix
// before
delayRender('load');
fetchData().then(() => continueRender()); // missing handle
// after
const handle = delayRender('load');
fetchData().then(() => continueRender(handle)); Defensive patterns
Strategy: validation
Validate before calling
if (typeof handle !== 'number') {
// programming error: do not call continueRender
} else {
continueRender(handle);
} Type guard
const isValidDelayHandle = (h: unknown): h is number => typeof h === 'number';
Prevention
- Always capture `const handle = delayRender(...)` and pass it back to continueRender.
- Keep handle in a ref/variable in scope for the cleanup call.
- Prefer useDelayRender for component-driven lifecycles.
When it happens
Trigger: Calling continueRender() with no argument, continueRender(undefined), or passing a variable that was never assigned the delayRender handle. Common in cleanup effects where the handle was not captured.
Common situations: Forgetting to capture const handle = delayRender(); calling continueRender in a different scope that lacks the handle; refactor that dropped the handle binding.
Related errors
- The label parameter of delayRender() must be a string or und
- The parameter passed into continueRender() must be the retur
- inputRange must contain only numbers
- outputStyles must contain only objects
- Argument passed to "${api}" for param "${param}" is undefine
AI-assisted analysis of remotion-dev/remotion@78fe4bb3fd (2026-08-12).
Data as JSON: /api/errors/0106119d5bf95a46.
Report an issue: GitHub.