denoland / denoland/std

suggestion: add `promiseState()` to `@std/async`

Open
#5,727 3 comments 1 reaction 0 assignees View on GitHub
feedback welcome suggestion
Dominant language
TypeScript
Stars
3.6k
Forks
681
PR merge metrics
No merged PRs in 30d

Description

Please add this utility to check the Promise status

```ts
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): Promise {
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(resolve => setTimeout(resolve, 0));
}

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

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

```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.