Skip to content

Commit f23232f

Browse files
victorporofdylhunn
authored andcommitted
feat(zone.js): Update to the simpler Async Stack Tagging v2 API (#46958)
Signed-off-by: Victor Porof <[email protected]> PR Close #46958
1 parent 2b4d7f6 commit f23232f

File tree

2 files changed

+41
-54
lines changed

2 files changed

+41
-54
lines changed

packages/zone.js/lib/zone-spec/async-stack-tagging.ts

Lines changed: 17 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7,58 +7,44 @@
77
*/
88

99
interface Console {
10-
scheduleAsyncTask(name: string, recurring?: boolean): number;
11-
startAsyncTask(task: number): void;
12-
finishAsyncTask(task: number): void;
13-
cancelAsyncTask(task: number): void;
10+
createTask(name: string): ConsoleTask;
11+
}
12+
13+
interface ConsoleTask {
14+
run<T>(f: () => T): void;
1415
}
1516

1617
interface Task {
17-
asyncId?: number;
18+
consoleTask?: ConsoleTask;
1819
}
1920

2021
class AsyncStackTaggingZoneSpec implements ZoneSpec {
21-
scheduleAsyncTask: Console['scheduleAsyncTask'];
22-
startAsyncTask: Console['startAsyncTask'];
23-
finishAsyncTask: Console['finishAsyncTask'];
24-
cancelAsyncTask: Console['finishAsyncTask'];
22+
createTask: Console['createTask'];
2523

2624
constructor(namePrefix: string, consoleAsyncStackTaggingImpl: Console = console) {
2725
this.name = 'asyncStackTagging for ' + namePrefix;
28-
this.scheduleAsyncTask = consoleAsyncStackTaggingImpl?.scheduleAsyncTask ?? (() => {});
29-
this.startAsyncTask = consoleAsyncStackTaggingImpl?.startAsyncTask ?? (() => {});
30-
this.finishAsyncTask = consoleAsyncStackTaggingImpl?.finishAsyncTask ?? (() => {});
31-
this.cancelAsyncTask = consoleAsyncStackTaggingImpl?.cancelAsyncTask ?? (() => {});
26+
this.createTask = consoleAsyncStackTaggingImpl?.createTask ?? (() => {});
3227
}
3328

3429
// ZoneSpec implementation below.
3530

3631
name: string;
3732

38-
onScheduleTask(delegate: ZoneDelegate, current: Zone, target: Zone, task: Task): Task {
39-
task.asyncId = this.scheduleAsyncTask(
40-
task.source || task.type, task.data?.isPeriodic || task.type === 'eventTask');
33+
onScheduleTask(delegate: ZoneDelegate, _current: Zone, target: Zone, task: Task): Task {
34+
task.consoleTask = this.createTask(`Zone - ${task.source || task.type}`);
4135
return delegate.scheduleTask(target, task);
4236
}
4337

4438
onInvokeTask(
45-
delegate: ZoneDelegate, currentZone: Zone, targetZone: Zone, task: Task, applyThis: any,
39+
delegate: ZoneDelegate, _currentZone: Zone, targetZone: Zone, task: Task, applyThis: any,
4640
applyArgs?: any[]) {
47-
task.asyncId && this.startAsyncTask(task.asyncId);
48-
try {
49-
return delegate.invokeTask(targetZone, task, applyThis, applyArgs);
50-
} finally {
51-
task.asyncId && this.finishAsyncTask(task.asyncId);
52-
if (task.type !== 'eventTask' && !task.data?.isPeriodic) {
53-
task.asyncId = undefined;
54-
}
41+
let ret;
42+
if (task.consoleTask) {
43+
ret = task.consoleTask.run(() => delegate.invokeTask(targetZone, task, applyThis, applyArgs));
44+
} else {
45+
ret = delegate.invokeTask(targetZone, task, applyThis, applyArgs);
5546
}
56-
}
57-
58-
onCancelTask(delegate: ZoneDelegate, currentZone: Zone, targetZone: Zone, task: Task) {
59-
task.asyncId && this.cancelAsyncTask(task.asyncId);
60-
task.asyncId = undefined;
61-
return delegate.cancelTask(targetZone, task);
47+
return ret;
6248
}
6349
}
6450

packages/zone.js/test/zone-spec/async-tagging-console.spec.ts

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,51 +12,55 @@ describe('AsyncTaggingConsoleTest', () => {
1212
const AsyncStackTaggingZoneSpec = (Zone as any)['AsyncStackTaggingZoneSpec'];
1313

1414
describe('should call console async stack tagging API', () => {
15-
let idx = 1;
16-
const scheduleAsyncTaskSpy = jasmine.createSpy('scheduleAsyncTask').and.callFake(() => {
17-
return idx++;
18-
});
1915
const startAsyncTaskSpy = jasmine.createSpy('startAsyncTask');
2016
const finishAsyncTaskSpy = jasmine.createSpy('finishAsyncTask');
21-
const cancelAsyncTaskSpy = jasmine.createSpy('cancelAsyncTask');
17+
const scheduleAsyncTaskSpy = jasmine.createSpy('scheduleAsyncTask').and.callFake(() => {
18+
return {
19+
run: (f: () => unknown) => {
20+
startAsyncTaskSpy();
21+
const retval = f();
22+
finishAsyncTaskSpy();
23+
return retval;
24+
},
25+
};
26+
});
27+
2228
let asyncStackTaggingZone: Zone;
2329

2430
beforeEach(() => {
2531
scheduleAsyncTaskSpy.calls.reset();
2632
startAsyncTaskSpy.calls.reset();
2733
finishAsyncTaskSpy.calls.reset();
28-
cancelAsyncTaskSpy.calls.reset();
2934
asyncStackTaggingZone = Zone.current.fork(new AsyncStackTaggingZoneSpec('test', {
30-
scheduleAsyncTask: scheduleAsyncTaskSpy,
31-
startAsyncTask: startAsyncTaskSpy,
32-
finishAsyncTask: finishAsyncTaskSpy,
33-
cancelAsyncTask: cancelAsyncTaskSpy,
35+
createTask: scheduleAsyncTaskSpy,
3436
}));
3537
});
38+
3639
it('setTimeout', (done: DoneFn) => {
3740
asyncStackTaggingZone.run(() => {
3841
setTimeout(() => {});
3942
});
4043
setTimeout(() => {
41-
expect(scheduleAsyncTaskSpy).toHaveBeenCalledWith('setTimeout', false);
44+
expect(scheduleAsyncTaskSpy).toHaveBeenCalledWith('Zone - setTimeout');
4245
expect(startAsyncTaskSpy.calls.count()).toBe(1);
4346
expect(finishAsyncTaskSpy.calls.count()).toBe(1);
4447
done();
4548
});
4649
});
50+
4751
it('clearTimeout', (done: DoneFn) => {
4852
asyncStackTaggingZone.run(() => {
4953
const id = setTimeout(() => {});
5054
clearTimeout(id);
5155
});
5256
setTimeout(() => {
53-
expect(scheduleAsyncTaskSpy).toHaveBeenCalledWith('setTimeout', false);
57+
expect(scheduleAsyncTaskSpy).toHaveBeenCalledWith('Zone - setTimeout');
5458
expect(startAsyncTaskSpy).not.toHaveBeenCalled();
5559
expect(finishAsyncTaskSpy).not.toHaveBeenCalled();
56-
expect(cancelAsyncTaskSpy.calls.count()).toBe(1);
5760
done();
5861
});
5962
});
63+
6064
it('setInterval', (done: DoneFn) => {
6165
asyncStackTaggingZone.run(() => {
6266
let count = 0;
@@ -68,19 +72,19 @@ describe('AsyncTaggingConsoleTest', () => {
6872
}, 10);
6973
});
7074
setTimeout(() => {
71-
expect(scheduleAsyncTaskSpy).toHaveBeenCalledWith('setInterval', true);
75+
expect(scheduleAsyncTaskSpy).toHaveBeenCalledWith('Zone - setInterval');
7276
expect(startAsyncTaskSpy.calls.count()).toBe(2);
73-
expect(finishAsyncTaskSpy.calls.count()).toBe(1);
74-
expect(cancelAsyncTaskSpy.calls.count()).toBe(1);
77+
expect(finishAsyncTaskSpy.calls.count()).toBe(2);
7578
done();
7679
}, 50);
7780
});
81+
7882
it('Promise', (done: DoneFn) => {
7983
asyncStackTaggingZone.run(() => {
8084
Promise.resolve(1).then(() => {});
8185
});
8286
setTimeout(() => {
83-
expect(scheduleAsyncTaskSpy).toHaveBeenCalledWith('Promise.then', false);
87+
expect(scheduleAsyncTaskSpy).toHaveBeenCalledWith('Zone - Promise.then');
8488
expect(startAsyncTaskSpy.calls.count()).toBe(1);
8589
expect(finishAsyncTaskSpy.calls.count()).toBe(1);
8690
done();
@@ -94,12 +98,10 @@ describe('AsyncTaggingConsoleTest', () => {
9498
Zone.root.run(() => {
9599
setTimeout(() => {
96100
expect(scheduleAsyncTaskSpy.calls.all()[0].args).toEqual([
97-
'XMLHttpRequest.addEventListener:load',
98-
true,
101+
'Zone - XMLHttpRequest.addEventListener:load',
99102
]);
100103
expect(scheduleAsyncTaskSpy.calls.all()[1].args).toEqual([
101-
'XMLHttpRequest.send',
102-
false,
104+
'Zone - XMLHttpRequest.send',
103105
]);
104106
expect(startAsyncTaskSpy.calls.count()).toBe(2);
105107
expect(finishAsyncTaskSpy.calls.count()).toBe(2);
@@ -124,10 +126,9 @@ describe('AsyncTaggingConsoleTest', () => {
124126
button.dispatchEvent(clickEvent);
125127
button.removeEventListener('click', handler);
126128
expect(scheduleAsyncTaskSpy)
127-
.toHaveBeenCalledWith('HTMLButtonElement.addEventListener:click', true);
129+
.toHaveBeenCalledWith('Zone - HTMLButtonElement.addEventListener:click');
128130
expect(startAsyncTaskSpy.calls.count()).toBe(2);
129131
expect(finishAsyncTaskSpy.calls.count()).toBe(2);
130-
expect(cancelAsyncTaskSpy.calls.count()).toBe(1);
131132
});
132133
}));
133134
});

0 commit comments

Comments
 (0)