diff --git a/src/Future.ts b/src/Future.ts index 16d0bd7..c1e638b 100644 --- a/src/Future.ts +++ b/src/Future.ts @@ -101,8 +101,9 @@ export class Future { ) { const resolver = (value: A) => { if (this._state.tag === "Pending") { - this._state.resolveCallbacks?.forEach((func) => func(value)); + const resolveCallbacks = this._state.resolveCallbacks; this._state = { tag: "Resolved", value }; + resolveCallbacks?.forEach((func) => func(value)); } }; diff --git a/test/Future.test.ts b/test/Future.test.ts index dfc8e1d..f5a6712 100644 --- a/test/Future.test.ts +++ b/test/Future.test.ts @@ -419,3 +419,13 @@ test("Future isFuture", async () => { expect(Future.isFuture([])).toEqual(false); expect(Future.isFuture({})).toEqual(false); }); + +test("Future doesn't hang", async () => { + const future = Future.make((resolve) => { + setTimeout(() => resolve(0), 10); + }); + return future + .flatMap(() => Future.value(1)) + .flatMap(() => future.flatMap(() => Future.value(2))) + .tap((value) => expect(value).toEqual(2)); +});