Skip to content

Commit 76eb156

Browse files
authored
fix: non-blocking async (#26)
1 parent 49b60b9 commit 76eb156

File tree

4 files changed

+98
-35
lines changed

4 files changed

+98
-35
lines changed

README.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,16 @@ await emitter.emit("event");
5151

5252
### Conditional event handlers.
5353

54-
IMPORTANT: conditional handlers not supported to conjoined event.
54+
IMPORTANT:
55+
56+
- NOT supported in conjoined events.
57+
- NOT supported any arguments in handlers.
58+
- It will be executed after the triggered event finished. (Blocking mode.)
5559

5660
```typescript
5761
const emitter = new Xevt();
5862
const result: any[] = [];
59-
emitter.on("event", (arg: number) => {
63+
emitter.on("event", async (arg: number) => {
6064
result.push(arg);
6165
return arg % 2 === 0;
6266
});

modules/runners/dual.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@ export class DualRunner<N = any> {
1414
* Create a new instance of the DualRunner.
1515
* @param handlers The dual handler profile.
1616
*/
17-
constructor(
18-
private handlers: DualEventHandlerSignature<N>[],
19-
) {
17+
constructor(private handlers: DualEventHandlerSignature<N>[]) {
2018
this.handlers = handlers;
2119
}
2220

@@ -54,6 +52,8 @@ export class DualRunner<N = any> {
5452
* @param args The arguments to pass to the dual handler.
5553
*/
5654
exec(result: any) {
57-
return new RelayRunner().exec(result, (p) => this.dualExec(p));
55+
return new RelayRunner().exec(result, (p) => this.dualExec(p), {
56+
async: true,
57+
});
5858
}
5959
}

modules/runners/step.ts

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,9 @@ export class StepRunner {
5151
const result = new SingleRunner(handler).exec(args);
5252

5353
const next = (result: any) => {
54-
const dualResult = new DualRunner(duals).exec(!!result);
55-
return new RelayRunner().exec(
56-
dualResult,
57-
() => this.execByIndex(handlers, duals, args, idx + 1),
54+
const dualResult = new DualRunner(duals).exec(result);
55+
return new RelayRunner().exec(dualResult, () =>
56+
this.execByIndex(handlers, duals, args, idx + 1),
5857
);
5958
};
6059

@@ -72,8 +71,9 @@ export class StepRunner {
7271
for (const p of handlers.filter((e) => !!e.options?.once)) {
7372
this.remove(step, p);
7473
}
75-
return new SequenceRunner(handlers as GeneralEventHandlerSignature<any>[])
76-
.exec(args);
74+
return new SequenceRunner(
75+
handlers as GeneralEventHandlerSignature<any>[],
76+
).exec(args);
7777
}
7878

7979
/**
@@ -84,21 +84,24 @@ export class StepRunner {
8484
handlers: EventHandlerSignature<any>[],
8585
args?: any[],
8686
) {
87-
const categories = handlers.reduce((y, x) => {
88-
if (x.options?.once) {
89-
y.once.push(x);
90-
}
91-
if (helpers.isDualSignature(x)) {
92-
y.duals.push(x);
93-
} else {
94-
y.handlers.push(x);
95-
}
96-
return y;
97-
}, {
98-
handlers: [] as GeneralEventHandlerSignature<any>[],
99-
duals: [] as DualEventHandlerSignature<any>[],
100-
once: [] as EventHandlerSignature<any>[],
101-
});
87+
const categories = handlers.reduce(
88+
(y, x) => {
89+
if (x.options?.once) {
90+
y.once.push(x);
91+
}
92+
if (helpers.isDualSignature(x)) {
93+
y.duals.push(x);
94+
} else {
95+
y.handlers.push(x);
96+
}
97+
return y;
98+
},
99+
{
100+
handlers: [] as GeneralEventHandlerSignature<any>[],
101+
duals: [] as DualEventHandlerSignature<any>[],
102+
once: [] as EventHandlerSignature<any>[],
103+
},
104+
);
102105
if (!categories.handlers.length) return;
103106

104107
for (const p of categories.once) {

tests/deno/single_event_test.ts

Lines changed: 64 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ describe("Xevt - unscriber", () => {
183183
});
184184
});
185185

186-
describe("Xevt - on", () => {
186+
describe("Xevt - conditional event handlers", () => {
187187
it('should listen event with "on"', () => {
188188
const emitter = new Xevt();
189189
const result: number[] = [];
@@ -206,6 +206,58 @@ describe("Xevt - on", () => {
206206
assertEquals(result, [1, 99, 2, 100]);
207207
});
208208

209+
it("should executed after async function", async () => {
210+
const emitter = new Xevt();
211+
const result: number[] = [];
212+
// deno-lint-ignore require-await
213+
emitter.on("event", async (arg: number) => {
214+
result.push(arg);
215+
return arg % 2 === 0;
216+
});
217+
218+
emitter.on("event", {
219+
true: () => {
220+
result.push(100);
221+
},
222+
false: () => {
223+
result.push(99);
224+
},
225+
});
226+
227+
emitter.emit("event", 1);
228+
emitter.emit("event", 2);
229+
await delay(0);
230+
assertEquals(result, [1, 2, 99, 100]);
231+
});
232+
233+
it("should executed after async function - blocking", async () => {
234+
const emitter = new Xevt();
235+
const result: number[] = [];
236+
emitter.on(
237+
"event",
238+
// deno-lint-ignore require-await
239+
async (arg: number) => {
240+
result.push(arg);
241+
return arg % 2 === 0;
242+
},
243+
{ async: true },
244+
);
245+
246+
emitter.on("event", {
247+
true: () => {
248+
result.push(100);
249+
},
250+
false: () => {
251+
result.push(99);
252+
},
253+
});
254+
255+
emitter.emit("event", 1);
256+
emitter.emit("event", 2);
257+
await delay(0);
258+
assertEquals(result, [1, 99, 2, 100]);
259+
});
260+
209261
it("should listen multiple on events", () => {
210262
const emitter = new Xevt();
211263
const result: any[] = [];
@@ -260,14 +312,18 @@ describe("Xevt - on", () => {
260312
},
261313
});
262314

263-
emitter.on("event", {
264-
true: () => {
265-
result.push(100);
266-
},
267-
false: () => {
268-
result.push(99);
315+
emitter.on(
316+
"event",
317+
{
318+
true: () => {
319+
result.push(100);
320+
},
321+
false: () => {
322+
result.push(99);
323+
},
269324
},
270-
}, { once: true });
325+
{ once: true },
326+
);
271327

272328
emitter.emit("event", 1);
273329
emitter.emit("event", 2);

0 commit comments

Comments
 (0)