Skip to content

Commit 6000b25

Browse files
committed
⚡ Call 'reject' rather than throwing Error
Signed-off-by: kei-g <km.8k6ce+github@gmail.com>
1 parent 3af254f commit 6000b25

File tree

2 files changed

+37
-25
lines changed

2 files changed

+37
-25
lines changed

async-iterable-queue.ts

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -93,28 +93,32 @@ export class AsyncIterableQueue<T> implements AsyncIterable<T> {
9393
* @param cb 終端が読み取られた後に呼ばれるコールバック関数
9494
*/
9595
end(cb?: NoParameterCallback): Promise<void> {
96-
const state = this.#state
97-
if (state)
98-
throw new Error(state)
99-
this.#state = 'ending'
100-
return new Promise((resolve: Resolver<void>) => (
101-
this.#emitter.emit('enq', new Terminator(cb)),
102-
resolve()
103-
))
96+
return new Promise(
97+
(resolve: Resolver<void>, reject: SingleParameterAction<unknown>) => {
98+
const state = this.#state
99+
if (state)
100+
return reject(new Error(state))
101+
this.#state = 'ending'
102+
this.#emitter.emit('enq', new Terminator(cb))
103+
return resolve()
104+
}
105+
)
104106
}
105107

106108
/**
107109
* この待ち行列の末尾に要素を追加する
108110
* @param value 要素の値
109111
*/
110112
push(value: T): Promise<void> {
111-
const state = this.#state
112-
if (state)
113-
throw new Error(state)
114-
return new Promise((resolve: Resolver<void>) => (
115-
this.#emitter.emit('enq', value),
116-
resolve()
117-
))
113+
return new Promise(
114+
(resolve: Resolver<void>, reject: SingleParameterAction<unknown>) => {
115+
const state = this.#state
116+
if (state)
117+
return reject(new Error(state))
118+
this.#emitter.emit('enq', value)
119+
return resolve()
120+
}
121+
)
118122
}
119123

120124
/**
@@ -185,15 +189,12 @@ class Terminator {
185189
try {
186190
const result = this.cb()
187191
if (result instanceof Promise)
188-
result.catch(reject).then(resolve)
189-
else
190-
resolve()
192+
return result.catch(reject).then(resolve)
191193
}
192194
catch (err: unknown) {
193-
reject(err)
195+
return reject(err)
194196
}
195-
else
196-
resolve()
197+
return resolve()
197198
})
198199
}
199200
}

test/async-iterable-queue.spec.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { AsyncIterableQueue } from '../async-iterable-queue'
22
import { describe, it } from 'mocha'
33
import { expect } from 'chai'
4-
import { throws } from 'assert'
54

65
const source = [
76
Math.LN2,
@@ -23,7 +22,13 @@ describe('failure mission', async () => {
2322
for (const value of source)
2423
await q.push(value)
2524
await q.end()
26-
throws(() => q.end())
25+
let error: Error
26+
await q.end()
27+
.catch((reason: unknown) => {
28+
if (reason instanceof Error)
29+
error = reason
30+
})
31+
.finally(() => expect(error).instanceOf(Error))
2732
}
2833
await Promise.all([popAsync(q), pushAsync()])
2934
})
@@ -33,7 +38,13 @@ describe('failure mission', async () => {
3338
for (const value of source)
3439
await q.push(value)
3540
await q.end()
36-
throws(() => q.push(Math.SQRT2))
41+
let error: Error
42+
await q.push(Math.SQRT2)
43+
.catch((reason?: unknown) => {
44+
if (reason instanceof Error)
45+
error = reason
46+
})
47+
.finally(() => expect(error).instanceOf(Error))
3748
}
3849
await Promise.all([popAsync(q), pushAsync()])
3950
})
@@ -44,7 +55,7 @@ describe('failure mission', async () => {
4455
await q.push(value)
4556
await q.end(() => {
4657
throw new Error()
47-
})
58+
}).catch((reason?: unknown) => expect(reason).instanceOf(Error))
4859
}
4960
await Promise.all([popAsync(q), pushAsync()])
5061
})

0 commit comments

Comments
 (0)