diff options
Diffstat (limited to 'editors/code/src/ctx.ts')
-rw-r--r-- | editors/code/src/ctx.ts | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/editors/code/src/ctx.ts b/editors/code/src/ctx.ts index d3ef27e43..39eddfcbd 100644 --- a/editors/code/src/ctx.ts +++ b/editors/code/src/ctx.ts | |||
@@ -62,23 +62,30 @@ export class Ctx { | |||
62 | this.extCtx.subscriptions.push(d); | 62 | this.extCtx.subscriptions.push(d); |
63 | } | 63 | } |
64 | 64 | ||
65 | async sendRequestWithRetry<R>(method: string, param: any, token: vscode.CancellationToken): Promise<R> { | 65 | async sendRequestWithRetry<R>( |
66 | method: string, | ||
67 | param: any, | ||
68 | token: vscode.CancellationToken, | ||
69 | ): Promise<R> { | ||
66 | await this.client.onReady(); | 70 | await this.client.onReady(); |
67 | for (const delay of [2, 4, 6, 8, 10, null]) { | 71 | for (const delay of [2, 4, 6, 8, 10, null]) { |
68 | try { | 72 | try { |
69 | return await this.client.sendRequest(method, param, token); | 73 | return await this.client.sendRequest(method, param, token); |
70 | } catch (e) { | 74 | } catch (e) { |
71 | if (e.code === lc.ErrorCodes.ContentModified && delay !== null) { | 75 | if ( |
72 | await sleep(10 * (1 << delay)) | 76 | e.code === lc.ErrorCodes.ContentModified && |
77 | delay !== null | ||
78 | ) { | ||
79 | await sleep(10 * (1 << delay)); | ||
73 | continue; | 80 | continue; |
74 | } | 81 | } |
75 | throw e; | 82 | throw e; |
76 | } | 83 | } |
77 | } | 84 | } |
78 | throw 'unreachable' | 85 | throw 'unreachable'; |
79 | } | 86 | } |
80 | } | 87 | } |
81 | 88 | ||
82 | export type Cmd = (...args: any[]) => any; | 89 | export type Cmd = (...args: any[]) => any; |
83 | 90 | ||
84 | const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)) | 91 | const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)); |