From 8f52f4ef9f251668a031c7876da1051573e4f864 Mon Sep 17 00:00:00 2001 From: bloodyowl Date: Tue, 20 Feb 2024 14:53:24 +0100 Subject: [PATCH] Prevent Futures from hanging when circular --- src/Future.ts | 3 ++- test/Future.test.ts | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) 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)); +});