Skip to content
This repository was archived by the owner on Dec 21, 2021. It is now read-only.

Commit 2638f2b

Browse files
committed
perf(util/defer): Rejig exposed functions so resolve/reject can be gc'ed.
1 parent de7b689 commit 2638f2b

File tree

1 file changed

+24
-5
lines changed

1 file changed

+24
-5
lines changed

src/utils/index.ts

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -220,13 +220,32 @@ export function CacheFn(fn: Parameters<typeof mem>[0], {
220220
type PromiseResolve = L.Compulsory<Parameters<Promise<any>['then']>>[0]
221221
type PromiseReject = L.Compulsory<Parameters<Promise<any>['then']>>[1]
222222

223-
export function Defer<T>(executor: (...args: Parameters<Promise<T>['then']>) => void = () => {}) {
224-
let resolve: PromiseResolve = () => {}
225-
let reject: PromiseReject = () => {}
223+
const noop = () => {}
224+
225+
export function Defer<T>(executor: (...args: Parameters<Promise<T>['then']>) => void = noop) {
226+
let resolveFn: PromiseResolve | undefined
227+
let rejectFn: PromiseResolve | undefined
228+
const resolve: PromiseReject = (value) => {
229+
if (resolveFn) {
230+
const r = resolveFn
231+
resolveFn = undefined
232+
rejectFn = undefined
233+
r(value)
234+
}
235+
}
236+
const reject: PromiseReject = (error) => {
237+
if (rejectFn) {
238+
const r = rejectFn
239+
resolveFn = undefined
240+
rejectFn = undefined
241+
r(error)
242+
}
243+
}
244+
226245
// eslint-disable-next-line promise/param-names
227246
const p = new Promise((_resolve, _reject) => {
228-
resolve = _resolve
229-
reject = _reject
247+
resolveFn = _resolve
248+
rejectFn = _reject
230249
executor(resolve, reject)
231250
})
232251
p.catch(() => {}) // prevent unhandledrejection

0 commit comments

Comments
 (0)