Skip to content

Commit 16eed5b

Browse files
committed
Create a copy of CancelablePromise
1 parent a208974 commit 16eed5b

File tree

2 files changed

+37
-6
lines changed

2 files changed

+37
-6
lines changed

src/components/PromQueryField.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,18 @@ import {
1313
TypeaheadOutput,
1414
withTheme2,
1515
} from '@grafana/ui';
16-
import { LocalStorageValueProvider } from 'app/core/components/LocalStorageValueProvider';
17-
import {
18-
CancelablePromise,
19-
isCancelablePromiseRejection,
20-
makePromiseCancelable,
21-
} from 'app/core/utils/CancelablePromise';
2216
import { LanguageMap, languages as prismLanguages } from 'prismjs';
2317
import React, { ReactNode } from 'react';
2418
import { Plugin } from 'slate';
2519
import { Editor } from 'slate-react';
2620

2721
import { PrometheusDatasource } from '../datasource';
22+
import { LocalStorageValueProvider } from '../gcopypaste/app/core/components/LocalStorageValueProvider';
23+
import {
24+
CancelablePromise,
25+
isCancelablePromiseRejection,
26+
makePromiseCancelable,
27+
} from '../gcopypaste/app/core/utils/CancelablePromise';
2828
import { roundMsToMin } from '../language_utils';
2929
import { PromOptions, PromQuery } from '../types';
3030

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// https://github.com/facebook/react/issues/5465
2+
3+
export interface CancelablePromise<T> {
4+
promise: Promise<T>;
5+
cancel: () => void;
6+
}
7+
8+
export interface CancelablePromiseRejection {
9+
isCanceled: boolean;
10+
}
11+
12+
export function isCancelablePromiseRejection(promise: unknown): promise is CancelablePromiseRejection {
13+
return typeof promise === 'object' && promise !== null && 'isCanceled' in promise;
14+
}
15+
16+
export const makePromiseCancelable = <T>(promise: Promise<T>): CancelablePromise<T> => {
17+
let hasCanceled_ = false;
18+
19+
const wrappedPromise = new Promise<T>((resolve, reject) => {
20+
const canceledPromiseRejection: CancelablePromiseRejection = { isCanceled: true };
21+
promise.then((val) => (hasCanceled_ ? reject(canceledPromiseRejection) : resolve(val)));
22+
promise.catch((error) => (hasCanceled_ ? reject(canceledPromiseRejection) : reject(error)));
23+
});
24+
25+
return {
26+
promise: wrappedPromise,
27+
cancel() {
28+
hasCanceled_ = true;
29+
},
30+
};
31+
};

0 commit comments

Comments
 (0)