gethue
Version:
Hue is an Open source SQL Query Editor for Databases/Warehouses
78 lines (70 loc) • 2.29 kB
text/typescript
// Licensed to Cloudera, Inc. under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. Cloudera, Inc. licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
export interface Cancellable {
cancel(): void;
}
export class CancellablePromise<T> extends Promise<T> implements Cancellable {
private readonly onCancel?: () => void;
private cancelPrevented?: boolean;
private completed: () => boolean;
cancelled?: boolean;
constructor(
handlers: (
resolve: (value?: T | PromiseLike<T>) => void,
reject: (reason?: unknown) => void,
onCancel: (cancelHandler: () => void) => void
) => void
) {
let onCancel: undefined | (() => void) = undefined;
let completed = false;
super((resolve, reject) =>
handlers(
val => {
completed = true;
resolve(val);
},
err => {
completed = true;
reject(err);
},
(cancelHandler: () => void) => (onCancel = cancelHandler)
)
);
this.onCancel = onCancel;
this.completed = () => completed;
}
cancel(): void {
if (!this.completed() && !this.cancelled && !this.cancelPrevented) {
if (this.onCancel) {
this.onCancel();
}
this.cancelled = true;
}
}
preventCancel(): void {
this.cancelPrevented = true;
}
static reject<T = unknown>(reason?: unknown): CancellablePromise<T> {
return new CancellablePromise<T>((resolve, reject) => {
reject(reason);
});
}
static resolve<T = unknown>(value?: T | PromiseLike<T>): CancellablePromise<T> {
return new CancellablePromise<T>(resolve => {
resolve(value);
});
}
}