@@ -40,6 +40,7 @@ export class PrsTreeModel extends Disposable {
4040
4141 private _cachedPRs : Map < FolderRepositoryManager , Map < string | PRType . LocalPullRequest | PRType . All , ItemsResponseResult < PullRequestModel > > > = new Map ( ) ;
4242 private readonly _repoEvents : Map < FolderRepositoryManager , vscode . Disposable [ ] > = new Map ( ) ;
43+ private _getPullRequestsForQueryLock : Promise < void > = Promise . resolve ( ) ;
4344
4445 constructor ( private _telemetry : ITelemetry , private readonly _reposManager : RepositoriesManager , private readonly _context : vscode . ExtensionContext ) {
4546 super ( ) ;
@@ -238,26 +239,36 @@ export class PrsTreeModel extends Disposable {
238239 }
239240
240241 async getPullRequestsForQuery ( folderRepoManager : FolderRepositoryManager , fetchNextPage : boolean , query : string ) : Promise < ItemsResponseResult < PullRequestModel > > {
241- const cache = this . getFolderCache ( folderRepoManager ) ;
242- if ( ! fetchNextPage && cache . has ( query ) ) {
243- return cache . get ( query ) ! ;
244- }
245-
246- const prs = await folderRepoManager . getPullRequests (
247- PRType . Query ,
248- { fetchNextPage } ,
249- query ,
250- ) ;
251- cache . set ( query , prs ) ;
242+ let release : ( ) => void ;
243+ const lock = new Promise < void > ( resolve => { release = resolve ; } ) ;
244+ const prev = this . _getPullRequestsForQueryLock ;
245+ this . _getPullRequestsForQueryLock = prev . then ( ( ) => lock ) ;
246+ await prev ;
247+
248+ try {
249+ const cache = this . getFolderCache ( folderRepoManager ) ;
250+ if ( ! fetchNextPage && cache . has ( query ) ) {
251+ return cache . get ( query ) ! ;
252+ }
252253
253- /* __GDPR__
254- "pr.expand.query" : {}
255- */
256- this . _telemetry . sendTelemetryEvent ( 'pr.expand.query' ) ;
257- // Don't await this._getChecks. It fires an event that will be listened to.
258- this . _getChecks ( prs . items ) ;
259- this . hasLoaded = true ;
260- return prs ;
254+ const prs = await folderRepoManager . getPullRequests (
255+ PRType . Query ,
256+ { fetchNextPage } ,
257+ query ,
258+ ) ;
259+ cache . set ( query , prs ) ;
260+
261+ /* __GDPR__
262+ "pr.expand.query" : {}
263+ */
264+ this . _telemetry . sendTelemetryEvent ( 'pr.expand.query' ) ;
265+ // Don't await this._getChecks. It fires an event that will be listened to.
266+ this . _getChecks ( prs . items ) ;
267+ this . hasLoaded = true ;
268+ return prs ;
269+ } finally {
270+ release ! ( ) ;
271+ }
261272 }
262273
263274 async getAllPullRequests ( folderRepoManager : FolderRepositoryManager , fetchNextPage : boolean , update ?: boolean ) : Promise < ItemsResponseResult < PullRequestModel > > {
0 commit comments