Skip to content

Commit

Permalink
Add promise utils
Browse files Browse the repository at this point in the history
  • Loading branch information
Exelord committed Jan 18, 2023
1 parent 7e7addc commit b111e11
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 3 deletions.
34 changes: 34 additions & 0 deletions src/utils/promise.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
export interface ControlledPromise<T = any> extends Promise<T> {
resolve: (value: T) => void;
reject: (reason?: unknown) => void;
}

export function controlledPromise<T = any>(): ControlledPromise<T> {
let resolve;
let reject;

const promise = new Promise((resolvePromise, rejectPromise) => {
resolve = resolvePromise;
reject = rejectPromise;
}) as ControlledPromise<T>;

promise.resolve = resolve as any as ControlledPromise["resolve"];
promise.reject = reject as any as ControlledPromise["reject"];

return promise;
}

export function signalledPromise<T>(signal: AbortSignal, promise: Promise<T>) {
return Promise.race([
new Promise<never>((_resolve, reject) => {
signal.addEventListener("abort", () => {
reject(signal.reason);
});
}),
promise,
]);
}

export function timeoutPromise(ms: number) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
6 changes: 3 additions & 3 deletions tests/src/task.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {
TaskDroppedError,
TaskStatus,
} from "src/task";
import { createControlledPromise } from "src/utils/promise";
import { controlledPromise } from "src/utils/promise";
import { describe, test, expect } from "vitest";

describe("Task", () => {
Expand Down Expand Up @@ -53,7 +53,7 @@ describe("Task", () => {

describe("#cancel", async () => {
test("cancelling pending task", async () => {
const promise = createControlledPromise();
const promise = controlledPromise();
const task = createTask(() => promise);

expect(task.status).toBe(TaskStatus.Idle);
Expand All @@ -78,7 +78,7 @@ describe("Task", () => {
});

test("cancelling idle task", async () => {
const promise = createControlledPromise();
const promise = controlledPromise();
const task = createTask(() => promise);

expect(task.status).toBe(TaskStatus.Idle);
Expand Down

0 comments on commit b111e11

Please sign in to comment.