177 lines
4.5 KiB
TypeScript
177 lines
4.5 KiB
TypeScript
|
declare class CancelErrorClass extends Error {
|
||
|
readonly name: 'CancelError';
|
||
|
readonly isCanceled: true;
|
||
|
|
||
|
constructor(reason?: string);
|
||
|
}
|
||
|
|
||
|
declare namespace PCancelable {
|
||
|
/**
|
||
|
Accepts a function that is called when the promise is canceled.
|
||
|
|
||
|
You're not required to call this function. You can call this function multiple times to add multiple cancel handlers.
|
||
|
*/
|
||
|
interface OnCancelFunction {
|
||
|
(cancelHandler: () => void): void;
|
||
|
shouldReject: boolean;
|
||
|
}
|
||
|
|
||
|
type CancelError = CancelErrorClass;
|
||
|
}
|
||
|
|
||
|
declare class PCancelable<ValueType> extends Promise<ValueType> {
|
||
|
/**
|
||
|
Convenience method to make your promise-returning or async function cancelable.
|
||
|
|
||
|
@param fn - A promise-returning function. The function you specify will have `onCancel` appended to its parameters.
|
||
|
|
||
|
@example
|
||
|
```
|
||
|
import PCancelable = require('p-cancelable');
|
||
|
|
||
|
const fn = PCancelable.fn((input, onCancel) => {
|
||
|
const job = new Job();
|
||
|
|
||
|
onCancel(() => {
|
||
|
job.cleanup();
|
||
|
});
|
||
|
|
||
|
return job.start(); //=> Promise
|
||
|
});
|
||
|
|
||
|
const cancelablePromise = fn('input'); //=> PCancelable
|
||
|
|
||
|
// …
|
||
|
|
||
|
cancelablePromise.cancel();
|
||
|
```
|
||
|
*/
|
||
|
static fn<ReturnType>(
|
||
|
userFn: (onCancel: PCancelable.OnCancelFunction) => PromiseLike<ReturnType>
|
||
|
): () => PCancelable<ReturnType>;
|
||
|
static fn<Agument1Type, ReturnType>(
|
||
|
userFn: (
|
||
|
argument1: Agument1Type,
|
||
|
onCancel: PCancelable.OnCancelFunction
|
||
|
) => PromiseLike<ReturnType>
|
||
|
): (argument1: Agument1Type) => PCancelable<ReturnType>;
|
||
|
static fn<Agument1Type, Agument2Type, ReturnType>(
|
||
|
userFn: (
|
||
|
argument1: Agument1Type,
|
||
|
argument2: Agument2Type,
|
||
|
onCancel: PCancelable.OnCancelFunction
|
||
|
) => PromiseLike<ReturnType>
|
||
|
): (
|
||
|
argument1: Agument1Type,
|
||
|
argument2: Agument2Type
|
||
|
) => PCancelable<ReturnType>;
|
||
|
static fn<Agument1Type, Agument2Type, Agument3Type, ReturnType>(
|
||
|
userFn: (
|
||
|
argument1: Agument1Type,
|
||
|
argument2: Agument2Type,
|
||
|
argument3: Agument3Type,
|
||
|
onCancel: PCancelable.OnCancelFunction
|
||
|
) => PromiseLike<ReturnType>
|
||
|
): (
|
||
|
argument1: Agument1Type,
|
||
|
argument2: Agument2Type,
|
||
|
argument3: Agument3Type
|
||
|
) => PCancelable<ReturnType>;
|
||
|
static fn<Agument1Type, Agument2Type, Agument3Type, Agument4Type, ReturnType>(
|
||
|
userFn: (
|
||
|
argument1: Agument1Type,
|
||
|
argument2: Agument2Type,
|
||
|
argument3: Agument3Type,
|
||
|
argument4: Agument4Type,
|
||
|
onCancel: PCancelable.OnCancelFunction
|
||
|
) => PromiseLike<ReturnType>
|
||
|
): (
|
||
|
argument1: Agument1Type,
|
||
|
argument2: Agument2Type,
|
||
|
argument3: Agument3Type,
|
||
|
argument4: Agument4Type
|
||
|
) => PCancelable<ReturnType>;
|
||
|
static fn<
|
||
|
Agument1Type,
|
||
|
Agument2Type,
|
||
|
Agument3Type,
|
||
|
Agument4Type,
|
||
|
Agument5Type,
|
||
|
ReturnType
|
||
|
>(
|
||
|
userFn: (
|
||
|
argument1: Agument1Type,
|
||
|
argument2: Agument2Type,
|
||
|
argument3: Agument3Type,
|
||
|
argument4: Agument4Type,
|
||
|
argument5: Agument5Type,
|
||
|
onCancel: PCancelable.OnCancelFunction
|
||
|
) => PromiseLike<ReturnType>
|
||
|
): (
|
||
|
argument1: Agument1Type,
|
||
|
argument2: Agument2Type,
|
||
|
argument3: Agument3Type,
|
||
|
argument4: Agument4Type,
|
||
|
argument5: Agument5Type
|
||
|
) => PCancelable<ReturnType>;
|
||
|
static fn<ReturnType>(
|
||
|
userFn: (...arguments: unknown[]) => PromiseLike<ReturnType>
|
||
|
): (...arguments: unknown[]) => PCancelable<ReturnType>;
|
||
|
|
||
|
/**
|
||
|
Create a promise that can be canceled.
|
||
|
|
||
|
Can be constructed in the same was as a [`Promise` constructor](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise), but with an appended `onCancel` parameter in `executor`. `PCancelable` is a subclass of `Promise`.
|
||
|
|
||
|
Cancelling will reject the promise with `CancelError`. To avoid that, set `onCancel.shouldReject` to `false`.
|
||
|
|
||
|
@example
|
||
|
```
|
||
|
import PCancelable = require('p-cancelable');
|
||
|
|
||
|
const cancelablePromise = new PCancelable((resolve, reject, onCancel) => {
|
||
|
const job = new Job();
|
||
|
|
||
|
onCancel.shouldReject = false;
|
||
|
onCancel(() => {
|
||
|
job.stop();
|
||
|
});
|
||
|
|
||
|
job.on('finish', resolve);
|
||
|
});
|
||
|
|
||
|
cancelablePromise.cancel(); // Doesn't throw an error
|
||
|
```
|
||
|
*/
|
||
|
constructor(
|
||
|
executor: (
|
||
|
resolve: (value?: ValueType | PromiseLike<ValueType>) => void,
|
||
|
reject: (reason?: unknown) => void,
|
||
|
onCancel: PCancelable.OnCancelFunction
|
||
|
) => void
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Whether the promise is canceled.
|
||
|
*/
|
||
|
readonly isCanceled: boolean;
|
||
|
|
||
|
/**
|
||
|
Cancel the promise and optionally provide a reason.
|
||
|
|
||
|
The cancellation is synchronous. Calling it after the promise has settled or multiple times does nothing.
|
||
|
|
||
|
@param reason - The cancellation reason to reject the promise with.
|
||
|
*/
|
||
|
cancel: (reason?: string) => void;
|
||
|
|
||
|
/**
|
||
|
Rejection reason when `.cancel()` is called.
|
||
|
|
||
|
It includes a `.isCanceled` property for convenience.
|
||
|
*/
|
||
|
static CancelError: typeof CancelErrorClass;
|
||
|
}
|
||
|
|
||
|
export = PCancelable;
|