@@ -21,8 +21,8 @@ export class EnvsCollectionService extends PythonEnvsWatcher<PythonEnvCollection
21
21
/** Keeps track of ongoing refreshes for various queries. */
22
22
private refreshPromises = new Map < PythonLocatorQuery | undefined , Promise < void > > ( ) ;
23
23
24
- /** Keeps track of whether there are any scheduled refreshes other than the ongoing one for various queries. */
25
- private scheduledRefreshes = new Map < PythonLocatorQuery | undefined , boolean > ( ) ;
24
+ /** Keeps track of scheduled refreshes other than the ongoing one for various queries. */
25
+ private scheduledRefreshes = new Map < PythonLocatorQuery | undefined , Promise < void > > ( ) ;
26
26
27
27
private readonly refreshStarted = new EventEmitter < void > ( ) ;
28
28
@@ -40,14 +40,14 @@ export class EnvsCollectionService extends PythonEnvsWatcher<PythonEnvCollection
40
40
super ( ) ;
41
41
this . locator . onChanged ( ( event ) => {
42
42
const query = undefined ; // We can also form a query based on the event, but skip that for simplicity.
43
- const isNewRefreshScheduled = this . scheduledRefreshes . get ( query ) ;
44
- if ( isNewRefreshScheduled ) {
45
- // If there is already a new refresh scheduled for the query, no need to start another one.
46
- return ;
43
+ let scheduledRefresh = this . scheduledRefreshes . get ( query ) ;
44
+ // If there is no refresh scheduled for the query, start a new one.
45
+ if ( ! scheduledRefresh ) {
46
+ scheduledRefresh = this . scheduleNewRefresh ( query ) ;
47
47
}
48
- this . scheduleNewRefresh ( query ) . then ( ( ) => {
48
+ scheduledRefresh . then ( ( ) => {
49
49
// Once refresh of cache is complete, notify changes.
50
- this . fire ( { type : event . type , searchLocation : event . searchLocation } ) ;
50
+ this . fire ( event ) ;
51
51
} ) ;
52
52
} ) ;
53
53
this . cache . onChanged ( ( e ) => {
@@ -73,7 +73,8 @@ export class EnvsCollectionService extends PythonEnvsWatcher<PythonEnvCollection
73
73
public getEnvs ( query ?: PythonLocatorQuery ) : PythonEnvInfo [ ] {
74
74
const cachedEnvs = this . cache . getAllEnvs ( ) ;
75
75
if ( cachedEnvs . length === 0 && this . refreshPromises . size === 0 ) {
76
- traceError ( 'Refresh should have already been triggered when activating discovery component' ) ;
76
+ // We expect a refresh to already be triggered when activating discovery component.
77
+ traceError ( 'No python is installed or a refresh has not already been triggered' ) ;
77
78
this . triggerRefresh ( ) . ignoreErrors ( ) ;
78
79
}
79
80
return query ? cachedEnvs . filter ( getQueryFilter ( query ) ) : cachedEnvs ;
@@ -159,13 +160,18 @@ export class EnvsCollectionService extends PythonEnvsWatcher<PythonEnvCollection
159
160
* Ensure we trigger a fresh refresh for the query after the current refresh (if any) is done.
160
161
*/
161
162
private async scheduleNewRefresh ( query ?: PythonLocatorQuery ) : Promise < void > {
162
- this . scheduledRefreshes . set ( query , true ) ;
163
- const refreshPromise = this . getRefreshPromiseForQuery ( query ) ?? Promise . resolve ( ) ;
164
- const nextRefreshPromise = refreshPromise . then ( ( ) => {
165
- // No more scheduled refreshes for this query as we're about to start the scheduled one.
166
- this . scheduledRefreshes . set ( query , false ) ;
167
- this . startRefresh ( query ) ;
168
- } ) ;
163
+ const refreshPromise = this . getRefreshPromiseForQuery ( query ) ;
164
+ let nextRefreshPromise : Promise < void > ;
165
+ if ( ! refreshPromise ) {
166
+ nextRefreshPromise = this . startRefresh ( query ) ;
167
+ } else {
168
+ nextRefreshPromise = refreshPromise . then ( ( ) => {
169
+ // No more scheduled refreshes for this query as we're about to start the scheduled one.
170
+ this . scheduledRefreshes . delete ( query ) ;
171
+ this . startRefresh ( query ) ;
172
+ } ) ;
173
+ this . scheduledRefreshes . set ( query , nextRefreshPromise ) ;
174
+ }
169
175
return nextRefreshPromise ;
170
176
}
171
177
}
0 commit comments