Skip to content

Commit 3cd0983

Browse files
committed
feat: do not throw on illegal state
1 parent a92d787 commit 3cd0983

File tree

4 files changed

+10
-51
lines changed

4 files changed

+10
-51
lines changed

src/DeferredPromise.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import { IllegalStateError } from "./IllegalStateError";
2-
31
export type DeferredPromiseState = "pending" | "resolved" | "rejected";
42

53
export type ResolveFunction<Data extends any, Result = void> = (
@@ -35,10 +33,7 @@ export class DeferredPromise<Data extends any = void> {
3533
this.promise = new Promise<Data>((resolve, reject) => {
3634
this.resolve = (data) => {
3735
if (this.state !== "pending") {
38-
throw new IllegalStateError(
39-
"Cannot resolve a DeferredPromise: illegal state",
40-
this.state
41-
);
36+
return;
4237
}
4338

4439
this.state = "resolved";
@@ -48,10 +43,7 @@ export class DeferredPromise<Data extends any = void> {
4843

4944
this.reject = (reason) => {
5045
if (this.state !== "pending") {
51-
throw new IllegalStateError(
52-
"Cannot reject a DeferredPromise: illegal state",
53-
this.state
54-
);
46+
return;
5547
}
5648

5749
this.state = "rejected";

src/IllegalStateError.ts

Lines changed: 0 additions & 8 deletions
This file was deleted.

src/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
export * from "./DeferredPromise";
2-
export * from "./IllegalStateError";

test/DeferredPromise.test.ts

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,4 @@
11
import { DeferredPromise } from "../src";
2-
import { IllegalStateError } from "../src/IllegalStateError";
3-
4-
function extractError<ErrorType extends Error>(fn: () => void): ErrorType {
5-
try {
6-
fn();
7-
} catch (error) {
8-
return error as ErrorType;
9-
}
10-
}
112

123
describe("Promise-compliance", () => {
134
it('can be listened to with ".then()"', (done) => {
@@ -108,44 +99,29 @@ describe("resolve()", () => {
10899
expect(promise.result).toBe(123);
109100
});
110101

111-
it("throws when resolving an already resolved promise", async () => {
102+
it("does nothing when resolving an already resolved promise", async () => {
112103
const promise = new DeferredPromise<number>();
113104
expect(promise.state).toBe("pending");
114105

115106
promise.resolve(123);
116107
expect(promise.state).toBe("resolved");
108+
expect(promise.result).toBe(123);
117109

118-
const stateError = extractError<IllegalStateError>(() => {
119-
promise.resolve(456);
120-
});
121-
122-
// Throws an illegal state error.
123-
expect(stateError).toBeInstanceOf(IllegalStateError);
124-
expect(stateError.message).toBe(
125-
"Cannot resolve a DeferredPromise: illegal state"
126-
);
127-
expect(stateError.state).toBe("resolved");
128-
129-
// The state remains resolved.
110+
// Resolving an already resolved Promise does nothing.
111+
promise.resolve(456);
130112
expect(promise.state).toBe("resolved");
113+
expect(promise.result).toBe(123);
131114
});
132115

133116
it("throws when resolving an already rejected promise", () => {
134117
const promise = new DeferredPromise<number>().catch(() => {});
135118
expect(promise.state).toBe("pending");
136119
promise.reject("first reason");
137120

138-
const stateError = extractError<IllegalStateError>(() => {
139-
promise.reject("second reason");
140-
});
141-
142-
expect(stateError).toBeInstanceOf(IllegalStateError);
143-
expect(stateError.message).toBe(
144-
"Cannot reject a DeferredPromise: illegal state"
145-
);
146-
expect(stateError.state).toBe("rejected");
121+
expect(promise.state).toBe("rejected");
122+
expect(promise.rejectionReason).toBe("first reason");
147123

148-
// The state remains rejected.
124+
promise.reject("second reason");
149125
expect(promise.state).toBe("rejected");
150126
expect(promise.rejectionReason).toBe("first reason");
151127
});

0 commit comments

Comments
 (0)