Skip to content

suggestion: add promiseState() to @std/async #5727

Description

@PandaWorker

Please add this utility to check the Promise status

export type PromiseState = 'fulfilled' | 'rejected' | 'pending';

var t = Symbol('t');

/**
 * Return state (fulfilled/rejected/pending) of a promise
 *
 * ```ts
 * import { assertEquals } from "@std/assert";
 * import { promiseState } from "@std/async/promise-state";
 *
 * assertEquals(await promiseState(Promise.resolve("value")), "fulfilled");
 * assertEquals(await promiseState(Promise.reject("error")), "rejected");
 * assertEquals(await promiseState(new Promise(() => {})), "pending");
 * ```
 */
export function promiseState(p: Promise<unknown>): Promise<PromiseState> {
	return Promise.race([p, t]).then(
		v => (v === t ? 'pending' : 'fulfilled'),
		() => 'rejected'
	);
}

export type PromiseStateOptions = {
	/**
	 * If true, the promise state is checked immediately without waiting for the next event loop.
	 */
	immediate?: boolean;
};

function flushPromises() {
	return new Promise<void>(resolve => setTimeout(resolve, 0));
}

export async function promiseState2(
	p: Promise<unknown>,
	{ immediate }: PromiseStateOptions = {}
): Promise<PromiseState> {
	if (!immediate) await flushPromises();

	return Promise.race([p, t]).then(
		v => (v === t ? 'pending' : 'fulfilled'),
		() => 'rejected'
	);
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    feedback welcomeWe want community's feedback on this issue or PRsuggestiona suggestion yet to be agreed

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions