diff --git a/extensions/typescript-language-features/src/tsServer/cachedResponse.ts b/extensions/typescript-language-features/src/tsServer/cachedResponse.ts index 6f8f8102626..71572c67a96 100644 --- a/extensions/typescript-language-features/src/tsServer/cachedResponse.ts +++ b/extensions/typescript-language-features/src/tsServer/cachedResponse.ts @@ -17,7 +17,7 @@ export class CachedResponse { f: () => Promise> ): Promise> { if (this.response && this.matches(document)) { - return this.response; + return this.response.then(result => result.type === 'cancelled' ? f() : result); } return this.update(document, f()); } @@ -26,10 +26,22 @@ export class CachedResponse { return this.version === document.version && this.document === document.uri.toString(); } - private update(document: vscode.TextDocument, response: Promise>): Promise> { + private async update( + document: vscode.TextDocument, + response: Promise> + ): Promise> { this.response = response; this.version = document.version; this.document = document.uri.toString(); - return response; + + const result = await response; + if (this.matches(document)) { + if (result.type === 'cancelled') { + // invalidate + this.version = -1; + this.document = ''; + } + } + return result; } }