1 | import { AsyncIterableX } from './asynciterablex';
|
2 | import { returnAsyncIterator } from '../internal/returniterator';
|
3 | export class CatchWithAsyncIterable extends AsyncIterableX {
|
4 | constructor(source, handler) {
|
5 | super();
|
6 | this._source = source;
|
7 | this._handler = handler;
|
8 | }
|
9 | async *[Symbol.asyncIterator]() {
|
10 | let err, hasError = false, it = this._source[Symbol.asyncIterator]();
|
11 | while (1) {
|
12 | let c = {};
|
13 | try {
|
14 | c = await it.next();
|
15 | if (c.done) {
|
16 | await returnAsyncIterator(it);
|
17 | break;
|
18 | }
|
19 | }
|
20 | catch (e) {
|
21 | err = await this._handler(e);
|
22 | hasError = true;
|
23 | await returnAsyncIterator(it);
|
24 | break;
|
25 | }
|
26 | yield c.value;
|
27 | }
|
28 | if (hasError) {
|
29 | for await (let item of err) {
|
30 | yield item;
|
31 | }
|
32 | }
|
33 | }
|
34 | }
|
35 | export function catchWith(source, handler) {
|
36 | return new CatchWithAsyncIterable(source, handler);
|
37 | }
|
38 |
|
39 |
|