diff --git a/src/view/prsTreeModel.ts b/src/view/prsTreeModel.ts index 2a9de433b2..bf7871f4b3 100644 --- a/src/view/prsTreeModel.ts +++ b/src/view/prsTreeModel.ts @@ -40,6 +40,7 @@ export class PrsTreeModel extends Disposable { private _cachedPRs: Map>> = new Map(); private readonly _repoEvents: Map = new Map(); + private _getPullRequestsForQueryLock: Promise = Promise.resolve(); constructor(private _telemetry: ITelemetry, private readonly _reposManager: RepositoriesManager, private readonly _context: vscode.ExtensionContext) { super(); @@ -238,26 +239,36 @@ export class PrsTreeModel extends Disposable { } async getPullRequestsForQuery(folderRepoManager: FolderRepositoryManager, fetchNextPage: boolean, query: string): Promise> { - const cache = this.getFolderCache(folderRepoManager); - if (!fetchNextPage && cache.has(query)) { - return cache.get(query)!; - } - - const prs = await folderRepoManager.getPullRequests( - PRType.Query, - { fetchNextPage }, - query, - ); - cache.set(query, prs); + let release: () => void; + const lock = new Promise(resolve => { release = resolve; }); + const prev = this._getPullRequestsForQueryLock; + this._getPullRequestsForQueryLock = prev.then(() => lock); + await prev; + + try { + const cache = this.getFolderCache(folderRepoManager); + if (!fetchNextPage && cache.has(query)) { + return cache.get(query)!; + } - /* __GDPR__ - "pr.expand.query" : {} - */ - this._telemetry.sendTelemetryEvent('pr.expand.query'); - // Don't await this._getChecks. It fires an event that will be listened to. - this._getChecks(prs.items); - this.hasLoaded = true; - return prs; + const prs = await folderRepoManager.getPullRequests( + PRType.Query, + { fetchNextPage }, + query, + ); + cache.set(query, prs); + + /* __GDPR__ + "pr.expand.query" : {} + */ + this._telemetry.sendTelemetryEvent('pr.expand.query'); + // Don't await this._getChecks. It fires an event that will be listened to. + this._getChecks(prs.items); + this.hasLoaded = true; + return prs; + } finally { + release!(); + } } async getAllPullRequests(folderRepoManager: FolderRepositoryManager, fetchNextPage: boolean, update?: boolean): Promise> { diff --git a/src/view/treeNodes/pullRequestNode.ts b/src/view/treeNodes/pullRequestNode.ts index 0aaf93ae74..7cb779140b 100644 --- a/src/view/treeNodes/pullRequestNode.ts +++ b/src/view/treeNodes/pullRequestNode.ts @@ -54,11 +54,6 @@ export class PRNode extends TreeNode implements vscode.CommentingRangeProvider2 super(parent); this.registerSinceReviewChange(); this.registerConfigurationChange(); - this._register(this.pullRequestModel.onDidChange((e) => { - if (e.title || e.state) { - this.refresh(this); - } - })); this._register(this._folderReposManager.onDidChangeActivePullRequest(e => { if (e.new?.number === this.pullRequestModel.number || e.old?.number === this.pullRequestModel.number) { this.refresh(this);