Skip to content
This repository was archived by the owner on Jun 10, 2025. It is now read-only.

Commit c159143

Browse files
committed
feat(eventually): custom error constructor with last result inspection
1 parent f0b4dcf commit c159143

File tree

2 files changed

+12
-4
lines changed

2 files changed

+12
-4
lines changed

src/eventually.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ test('eventually', async () => {
88

99
test('eventually fails', async () => {
1010
await expect($.eventually($.gt(2), async () => 1, { delay: 10 }))
11-
.rejects.toThrow('Expected 1 to be greater than 2.')
11+
.rejects.toThrow('Expected 1 to be greater than 2. Last result was 1.')
1212
})

src/eventually.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
1+
const defaultError =
2+
<T>(err: unknown, result: T) =>
3+
new Error((err instanceof Error ? err.message : String(err)) + ' Last result was ' + JSON.stringify(result) + '.')
4+
15
const eventually =
26
async <T, U>(assert: (result: T) => U, poll: () => Promise<T>, {
37
retries = 10,
4-
delay = 1000
8+
delay = 1000,
9+
error = defaultError
510
}: {
611
retries?: number,
7-
delay?: number
12+
delay?: number,
13+
14+
/** Error constructor based on thrown assertion error and last polled result. */
15+
error?: (err: unknown, result: T) => unknown
816
} = {}): Promise<U> => {
917
for (let retry = 1; retry <= retries; retry++) {
1018
const before = Date.now()
@@ -13,7 +21,7 @@ const eventually =
1321
return assert(result)
1422
} catch (err) {
1523
if (retry === retries) {
16-
throw err
24+
throw error(err, result)
1725
}
1826
}
1927
const duration = Date.now() - before

0 commit comments

Comments
 (0)