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

  1. Always capture the handle: const handle = delayRender('label'); then continueRender(handle).
  2. Use the handle from the same scope that created it.
  3. 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

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


AI-assisted analysis of remotion-dev/remotion@78fe4bb3fd (2026-08-12). Data as JSON: /api/errors/0106119d5bf95a46. Report an issue: GitHub.