Skip to content

Commit 7a28f50

Browse files
JiaLiPassionalxhub
authored andcommitted
feat(zone.js): implement Promise.withResolvers() (#53514)
Implement `Promise.withResolvers()` ``` const {promise, resolve, reject} = Promise.withResolvers(); ``` PR Close #53514
1 parent cc02852 commit 7a28f50

2 files changed

Lines changed: 33 additions & 0 deletions

File tree

packages/zone.js/lib/common/promise.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,19 @@ Zone.__load_patch('ZoneAwarePromise', (global: any, Zone: ZoneType, api: _ZonePr
302302
return resolvePromise(<ZoneAwarePromise<U>>new this(null as any), REJECTED, error);
303303
}
304304

305+
static withResolvers<T>(): {
306+
promise: Promise<T>,
307+
resolve: (value?: T|PromiseLike<T>) => void,
308+
reject: (error?: any) => void
309+
} {
310+
const result: any = {};
311+
result.promise = new ZoneAwarePromise((res, rej) => {
312+
result.resolve = res;
313+
result.reject = rej;
314+
});
315+
return result;
316+
}
317+
305318
static any<T>(values: Iterable<PromiseLike<T>>): Promise<T> {
306319
if (!values || typeof values[Symbol.iterator] !== 'function') {
307320
return Promise.reject(new AggregateError([], 'All promises were rejected'));

packages/zone.js/test/common/Promise.spec.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -911,4 +911,24 @@ describe(
911911
});
912912
});
913913
});
914+
915+
describe('Promise.withResolvers', () => {
916+
it('should resolve', (done: DoneFn) => {
917+
const {promise, resolve, reject} = (Promise as any).withResolvers();
918+
promise.then((v: any) => {
919+
expect(v).toBe(1);
920+
done();
921+
});
922+
resolve(1);
923+
});
924+
it('should reject', (done: DoneFn) => {
925+
const {promise, resolve, reject} = (Promise as any).withResolvers();
926+
const error = new Error('test');
927+
promise.catch((e: any) => {
928+
expect(e).toBe(error);
929+
done();
930+
});
931+
reject(error);
932+
});
933+
});
914934
}));

0 commit comments

Comments
 (0)