From e04b43cf440343cf2e42f8a838a2377ebc68f1c4 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Wed, 10 Feb 2021 14:37:11 -0700 Subject: [PATCH] Properly dispose of events in combineIterators() (Locators.iterEnvs()). (#15352) The actual fix is in combineIterators(). Note that we also were not disposing of the event emitter in combineIterators(). This change removes the emitter, so it's a moot point. --- .../pythonEnvironments/base/locators.ts | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/client/pythonEnvironments/base/locators.ts b/src/client/pythonEnvironments/base/locators.ts index 41844c3fea21..9bf85f4778fd 100644 --- a/src/client/pythonEnvironments/base/locators.ts +++ b/src/client/pythonEnvironments/base/locators.ts @@ -1,8 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -import { EventEmitter } from 'vscode'; import { chain } from '../../common/utils/async'; +import { Disposables } from '../../common/utils/resourceLifecycle'; import { PythonEnvInfo } from './info'; import { ILocator, IPythonEnvsIterator, PythonEnvUpdatedEvent, PythonLocatorQuery } from './locator'; import { PythonEnvsWatchers } from './watchers'; @@ -18,23 +18,27 @@ export function combineIterators(iterators: IPythonEnvsIterator[]): IPythonEnvsI return result; } - const emitter = new EventEmitter(); - let numActive = events.length; - events.forEach((event) => { - event!((e: PythonEnvUpdatedEvent | null) => { - // NOSONAR - if (e === null) { - numActive -= 1; - if (numActive === 0) { - // All the sub-events are done so we're done. - emitter.fire(null); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + result.onUpdated = (handleEvent: (e: PythonEnvUpdatedEvent | null) => any) => { + const disposables = new Disposables(); + let numActive = events.length; + events.forEach((event) => { + const disposable = event!((e: PythonEnvUpdatedEvent | null) => { + // NOSONAR + if (e === null) { + numActive -= 1; + if (numActive === 0) { + // All the sub-events are done so we're done. + handleEvent(null); + } + } else { + handleEvent(e); } - } else { - emitter.fire(e); - } + }); + disposables.push(disposable); }); - }); - result.onUpdated = emitter.event; + return disposables; + }; return result; }