Skip to content

Commit 4a24129

Browse files
committed
Simplify info.rejected
1 parent 60249ed commit 4a24129

File tree

3 files changed

+22
-15
lines changed

3 files changed

+22
-15
lines changed

README.md

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -181,11 +181,8 @@ It is usually an `Error` instance but could be anything.
181181

182182
## `info.rejected`
183183

184-
Boolean indicating whether the promise was resolved or rejected. Only defined
185-
with
186-
[`unhandledRejection`](https://nodejs.org/api/process.html#process_event_unhandledrejection),
187-
[`rejectionHandled`](https://nodejs.org/api/process.html#process_event_rejectionhandled)
188-
and
184+
Boolean indicating whether the promise was initially resolved or rejected. Only
185+
defined with
189186
[`multipleResolves`](https://nodejs.org/api/process.html#process_event_multipleresolves).
190187

191188
## `info.nextValue`, `info.nextRejected`

src/info.js

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,29 @@ const getInfo = async function({
2424

2525
// Retrieve promise's resolved/rejected state and value.
2626
const parsePromise = async function({ eventName, promise, value }) {
27-
// `uncaughtException` and `warning` events do not have `rejected`.
28-
if (promise === undefined) {
27+
if (NO_PROMISE_EVENTS.includes(eventName)) {
2928
return { value }
3029
}
3130

32-
// `unhandledRejection` should not use the following code because:
33-
// - we already know `rejected` and `value`
34-
// - using `try/catch` will fire `rejectionHandled`
35-
if (eventName === 'unhandledRejection') {
36-
return { rejected: true, value }
31+
const { rejected, value: valueA } = await getPromiseValue({ promise })
32+
33+
// `rejected` is always `true` with `rejectionHandled`, so we skip it
34+
if (eventName === 'rejectionHandled') {
35+
return { value: valueA }
3736
}
3837

39-
// `rejectionHandled` and `multipleResolves` use `await promise`
38+
return { rejected, value: valueA }
39+
}
40+
41+
// Those events do not try to get the promise value.
42+
// For `uncaughtException` and `warning`, they are not promise-specific.
43+
// For `unhandledRejection`:
44+
// - we already know `rejected` and `value`
45+
// - using `try/catch` will fire `rejectionHandled`
46+
const NO_PROMISE_EVENTS = ['uncaughtException', 'warning', 'unhandledRejection']
47+
48+
// `rejectionHandled` and `multipleResolves` otherwise use `await promise`
49+
const getPromiseValue = async function({ promise }) {
4050
try {
4151
return { rejected: false, value: await promise }
4252
} catch (error) {

test/info.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ const INFOS = [
3434
{
3535
name: 'unhandledRejection',
3636
arg: () => true,
37-
expected: { rejected: true, value: true },
37+
expected: { value: true },
3838
},
3939
{
4040
name: 'rejectionHandled',
4141
arg: () => true,
42-
expected: { rejected: true, value: true },
42+
expected: { value: true },
4343
},
4444
{
4545
name: 'multipleResolves',

0 commit comments

Comments
 (0)