Home / Function/ async_derived() — svelte Function Reference

async_derived() — svelte Function Reference

Architecture documentation for the async_derived() function in deriveds.js from the svelte codebase.

Entity Profile

Dependency Diagram

graph TD
  a387a36f_f417_a149_0b1a_ee4a1da63440["async_derived()"]
  2fb8b3eb_7c25_3930_a184_09fab29d537f["deriveds.js"]
  a387a36f_f417_a149_0b1a_ee4a1da63440 -->|defined in| 2fb8b3eb_7c25_3930_a184_09fab29d537f
  b9aaaccb_7510_28de_bb53_f808b2cb1d5e["flatten()"]
  b9aaaccb_7510_28de_bb53_f808b2cb1d5e -->|calls| a387a36f_f417_a149_0b1a_ee4a1da63440
  b137f422_7d3c_218c_aaf9_1be0299ad652["async_derived_orphan()"]
  a387a36f_f417_a149_0b1a_ee4a1da63440 -->|calls| b137f422_7d3c_218c_aaf9_1be0299ad652
  1e2f7428_6050_5cb7_69db_bf5db719f6d1["source()"]
  a387a36f_f417_a149_0b1a_ee4a1da63440 -->|calls| 1e2f7428_6050_5cb7_69db_bf5db719f6d1
  b2eacc8a_e339_c7cd_329a_2445c4d5ac44["async_effect()"]
  a387a36f_f417_a149_0b1a_ee4a1da63440 -->|calls| b2eacc8a_e339_c7cd_329a_2445c4d5ac44
  ca823eda_572f_96a7_a6c1_3275230578c1["deferred()"]
  a387a36f_f417_a149_0b1a_ee4a1da63440 -->|calls| ca823eda_572f_96a7_a6c1_3275230578c1
  db550759_ee3b_160c_8afa_d1aa9fae478c["fn()"]
  a387a36f_f417_a149_0b1a_ee4a1da63440 -->|calls| db550759_ee3b_160c_8afa_d1aa9fae478c
  08445b6d_4083_dc8c_99d0_a3d4553d06cb["save()"]
  a387a36f_f417_a149_0b1a_ee4a1da63440 -->|calls| 08445b6d_4083_dc8c_99d0_a3d4553d06cb
  a0b8f840_863f_a966_d259_b866f80703d1["deactivate()"]
  a387a36f_f417_a149_0b1a_ee4a1da63440 -->|calls| a0b8f840_863f_a966_d259_b866f80703d1
  df71411d_ad64_65b8_da29_e77890377349["unset_context()"]
  a387a36f_f417_a149_0b1a_ee4a1da63440 -->|calls| df71411d_ad64_65b8_da29_e77890377349
  2ba0836c_3ec9_0e68_f2ba_cf1bb3adc645["is_rendered()"]
  a387a36f_f417_a149_0b1a_ee4a1da63440 -->|calls| 2ba0836c_3ec9_0e68_f2ba_cf1bb3adc645
  95fd9978_b635_37dc_dfee_13c687d48cd6["update_pending_count()"]
  a387a36f_f417_a149_0b1a_ee4a1da63440 -->|calls| 95fd9978_b635_37dc_dfee_13c687d48cd6
  a08b6cc5_af73_1be4_d02f_3113cf8a8305["get()"]
  a387a36f_f417_a149_0b1a_ee4a1da63440 -->|calls| a08b6cc5_af73_1be4_d02f_3113cf8a8305
  63ee8247_ada4_9f1d_e139_0c1167cd5b1c["set()"]
  a387a36f_f417_a149_0b1a_ee4a1da63440 -->|calls| 63ee8247_ada4_9f1d_e139_0c1167cd5b1c
  style a387a36f_f417_a149_0b1a_ee4a1da63440 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

packages/svelte/src/internal/client/reactivity/deriveds.js lines 99–242

export function async_derived(fn, label, location) {
	let parent = /** @type {Effect | null} */ (active_effect);

	if (parent === null) {
		e.async_derived_orphan();
	}

	var boundary = /** @type {Boundary} */ (parent.b);

	var promise = /** @type {Promise<V>} */ (/** @type {unknown} */ (undefined));
	var signal = source(/** @type {V} */ (UNINITIALIZED));

	if (DEV) signal.label = label;

	// only suspend in async deriveds created on initialisation
	var should_suspend = !active_reaction;

	/** @type {Map<Batch, ReturnType<typeof deferred<V>>>} */
	var deferreds = new Map();

	async_effect(() => {
		if (DEV) current_async_effect = active_effect;

		/** @type {ReturnType<typeof deferred<V>>} */
		var d = deferred();
		promise = d.promise;

		try {
			// If this code is changed at some point, make sure to still access the then property
			// of fn() to read any signals it might access, so that we track them as dependencies.
			// We call `unset_context` to undo any `save` calls that happen inside `fn()`
			Promise.resolve(fn())
				.then(d.resolve, d.reject)
				.then(() => {
					if (batch === current_batch && batch.committed) {
						// if the batch was rejected as stale, we need to cleanup
						// after any `$.save(...)` calls inside `fn()`
						batch.deactivate();
					}

					unset_context();
				});
		} catch (error) {
			d.reject(error);
			unset_context();
		}

		if (DEV) current_async_effect = null;

		var batch = /** @type {Batch} */ (current_batch);

		if (should_suspend) {
			var blocking = boundary.is_rendered();

			boundary.update_pending_count(1);
			batch.increment(blocking);

			deferreds.get(batch)?.reject(STALE_REACTION);
			deferreds.delete(batch); // delete to ensure correct order in Map iteration below
			deferreds.set(batch, d);
		}

		/**
		 * @param {any} value
		 * @param {unknown} error
		 */
		const handler = (value, error = undefined) => {
			current_async_effect = null;

			batch.activate();

			if (error) {
				if (error !== STALE_REACTION) {
					signal.f |= ERROR_VALUE;

					// @ts-expect-error the error is the wrong type, but we don't care
					internal_set(signal, error);
				}
			} else {
				if ((signal.f & ERROR_VALUE) !== 0) {
					signal.f ^= ERROR_VALUE;

Domain

Subdomains

Called By

Frequently Asked Questions

What does async_derived() do?
async_derived() is a function in the svelte codebase, defined in packages/svelte/src/internal/client/reactivity/deriveds.js.
Where is async_derived() defined?
async_derived() is defined in packages/svelte/src/internal/client/reactivity/deriveds.js at line 99.
What does async_derived() call?
async_derived() calls 18 function(s): activate, async_derived_orphan, async_effect, await_waterfall, deactivate, decrement, deferred, fn, and 10 more.
What calls async_derived()?
async_derived() is called by 1 function(s): flatten.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free