Skip to content

Commit 1bc7e3c

Browse files
MeAkibcrisbeto
authored andcommitted
refactor(core): use native Promise.withResolvers() in remaining tests
Replaces the remaining hand-rolled deferred promise implementations with the native `Promise.withResolvers()` API and removes the now unused helper and import. Follow-up to #69739.
1 parent 49a797f commit 1bc7e3c

19 files changed

Lines changed: 70 additions & 149 deletions

packages/common/http/test/fetch_spec.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -767,15 +767,12 @@ describe('FetchBackend', () => {
767767
export class MockFetchFactory extends FetchFactory {
768768
public readonly response = new MockFetchResponse();
769769
public readonly request = new MockFetchRequest();
770-
private resolve!: Function;
771-
private reject!: Function;
770+
private resolve!: (value: Response | PromiseLike<Response>) => void;
771+
private reject!: (reason?: any) => void;
772772

773773
private clearWarningTimeout?: VoidFunction;
774774

775-
private promise = new Promise<Response>((resolve, reject) => {
776-
this.resolve = resolve;
777-
this.reject = reject;
778-
});
775+
private promise = this.createFetchPromise();
779776

780777
override fetch = (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
781778
this.request.method = init?.method;
@@ -849,10 +846,14 @@ export class MockFetchFactory extends FetchFactory {
849846
}
850847

851848
resetFetchPromise() {
852-
this.promise = new Promise<Response>((resolve, reject) => {
853-
this.resolve = resolve;
854-
this.reject = reject;
855-
});
849+
this.promise = this.createFetchPromise();
850+
}
851+
852+
private createFetchPromise(): Promise<Response> {
853+
const {promise, resolve, reject} = Promise.withResolvers<Response>();
854+
this.resolve = resolve;
855+
this.reject = reject;
856+
return promise;
856857
}
857858
}
858859

packages/common/test/pipes/async_pipe_spec.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -178,10 +178,7 @@ describe('AsyncPipe', () => {
178178
let promise: Promise<any>;
179179

180180
beforeEach(() => {
181-
promise = new Promise((res, rej) => {
182-
resolve = res;
183-
reject = rej;
184-
});
181+
({promise, resolve, reject} = Promise.withResolvers<any>());
185182
});
186183

187184
describe('transform', () => {

packages/core/test/acceptance/change_detection_spec.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1523,9 +1523,7 @@ describe('change detection', () => {
15231523
private resolve?: Function;
15241524
changeDetectorRef = inject(ChangeDetectorRef);
15251525
createReadPromise() {
1526-
this.promise = new Promise<void>((resolve) => {
1527-
this.resolve = resolve;
1528-
});
1526+
({promise: this.promise, resolve: this.resolve} = Promise.withResolvers<void>());
15291527
}
15301528
resolveReadPromise() {
15311529
this.resolve?.();

packages/core/test/acceptance/pending_tasks_spec.ts

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,10 @@ describe('public PendingTasks', () => {
8888
const appRef = TestBed.inject(ApplicationRef);
8989
const pendingTasks = TestBed.inject(PendingTasks);
9090

91-
let resolveFn: () => void;
92-
pendingTasks.run(() => {
93-
return new Promise<void>((r) => {
94-
resolveFn = r;
95-
});
96-
});
91+
const {promise, resolve} = Promise.withResolvers<void>();
92+
pendingTasks.run(() => promise);
9793
await expectAsync(applicationRefIsStable(appRef)).toBeResolvedTo(false);
98-
resolveFn!();
94+
resolve();
9995
await expectAsync(TestBed.inject(ApplicationRef).whenStable()).toBeResolved();
10096
});
10197

@@ -105,14 +101,10 @@ describe('public PendingTasks', () => {
105101
const errorHandler = TestBed.inject(ErrorHandler);
106102
const spy = spyOn(errorHandler, 'handleError');
107103

108-
let rejectFn: () => void;
109-
pendingTasks.run(() => {
110-
return new Promise<void>((_, reject) => {
111-
rejectFn = reject;
112-
});
113-
});
104+
const {promise, reject} = Promise.withResolvers<void>();
105+
pendingTasks.run(() => promise);
114106
await expectAsync(applicationRefIsStable(appRef)).toBeResolvedTo(false);
115-
rejectFn!();
107+
reject();
116108
await expectAsync(appRef.whenStable()).toBeResolved();
117109
expect(spy).toHaveBeenCalled();
118110
});

packages/core/test/application_init_spec.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,7 @@ describe('ApplicationInitStatus', () => {
5050
let initFnInvoked = false;
5151

5252
beforeEach(() => {
53-
promise = new Promise((res, rej) => {
54-
resolve = res;
55-
reject = rej;
56-
});
53+
({promise, resolve, reject} = Promise.withResolvers<any>());
5754
TestBed.configureTestingModule({
5855
providers: [{provide: APP_INITIALIZER, useValue: [() => promise]}],
5956
});

packages/core/test/application_ref_spec.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -466,10 +466,7 @@ describe('bootstrap', () => {
466466
}));
467467

468468
it('should wait for asynchronous app initializers', waitForAsync(async () => {
469-
let resolve: (result: any) => void;
470-
const promise: Promise<any> = new Promise((res) => {
471-
resolve = res;
472-
});
469+
const {promise, resolve} = Promise.withResolvers<any>();
473470
let initializerDone = false;
474471
setTimeout(() => {
475472
resolve(true);
@@ -643,10 +640,7 @@ describe('bootstrap', () => {
643640
defaultPlatform = _platform;
644641
}));
645642
it('should wait for asynchronous app initializers', waitForAsync(async () => {
646-
let resolve: (result: any) => void;
647-
const promise: Promise<any> = new Promise((res) => {
648-
resolve = res;
649-
});
643+
const {promise, resolve} = Promise.withResolvers<any>();
650644
let initializerDone = false;
651645
setTimeout(() => {
652646
resolve(true);

packages/core/test/change_detection_scheduler_spec.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -469,10 +469,7 @@ describe('Angular with zoneless enabled', () => {
469469
});
470470

471471
it('executes render hooks when a new one is registered', async () => {
472-
let resolveFn: Function;
473-
let calledPromise = new Promise((resolve) => {
474-
resolveFn = resolve;
475-
});
472+
const {promise: calledPromise, resolve: resolveFn} = Promise.withResolvers<void>();
476473
TestBed.runInInjectionContext(() => {
477474
afterNextRender(() => {
478475
resolveFn();
@@ -496,10 +493,7 @@ describe('Angular with zoneless enabled', () => {
496493
await fixture.whenStable();
497494
expect(checks).toBe(1);
498495

499-
let resolveFn: Function;
500-
let calledPromise = new Promise((resolve) => {
501-
resolveFn = resolve;
502-
});
496+
const {promise: calledPromise, resolve: resolveFn} = Promise.withResolvers<void>();
503497
TestBed.runInInjectionContext(() => {
504498
afterNextRender(() => {
505499
resolveFn();

packages/core/test/di/inject_async/inject_async_spec.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,7 @@ describe('injectAsync', () => {
6262
});
6363

6464
await TestBed.runInInjectionContext(async () => {
65-
let prefetchResolve!: () => void;
66-
const prefetchPromise = new Promise<void>((resolve) => {
67-
prefetchResolve = resolve;
68-
});
65+
const {promise: prefetchPromise, resolve: prefetchResolve} = Promise.withResolvers<void>();
6966

7067
let prefetchCalled = false;
7168
const loader = () => {

packages/core/test/linker/integration_spec.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2422,13 +2422,11 @@ class PushCmpWithHostEvent {
24222422
})
24232423
class PushCmpWithAsyncPipe {
24242424
numberOfChecks: number = 0;
2425-
resolve!: (result: any) => void;
2425+
resolve: (result: any) => void;
24262426
promise: Promise<any>;
24272427

24282428
constructor() {
2429-
this.promise = new Promise((resolve) => {
2430-
this.resolve = resolve;
2431-
});
2429+
({promise: this.promise, resolve: this.resolve} = Promise.withResolvers<any>());
24322430
}
24332431

24342432
get field() {

packages/core/test/linker/resource_loader_mock.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -103,17 +103,16 @@ export class MockResourceLoader extends ResourceLoader {
103103
}
104104

105105
class _PendingRequest {
106-
// Using non null assertion, these fields are defined below
107-
// within the `new Promise` callback (synchronously).
108-
resolve!: (result: string) => void;
109-
reject!: (error: any) => void;
106+
resolve: (result: string) => void;
107+
reject: (error: any) => void;
110108
promise: Promise<string>;
111109

112110
constructor(public url: string) {
113-
this.promise = new Promise((res, rej) => {
114-
this.resolve = res;
115-
this.reject = rej;
116-
});
111+
({
112+
promise: this.promise,
113+
resolve: this.resolve,
114+
reject: this.reject,
115+
} = Promise.withResolvers<string>());
117116
}
118117

119118
complete(response: string | null) {

0 commit comments

Comments
 (0)