zutils/dist/utils/promise.util.d.ts
2024-01-23 19:29:44 +08:00

75 lines
2.0 KiB
TypeScript

type RetryOptions = {
maxRetries: number;
whitelistErrors: Error[];
};
/**
* Usage:
* retry(() => fetch("https://example.com"), { maxRetries: 3, whitelistErrors: [] })
* .then((response) => console.log(response))
* .catch((error) => console.error(error));
* @param promiseFn
* @param options
* @returns
*/
declare function retry<T>(promiseFn: () => Promise<T>, options: RetryOptions): Promise<T>;
/**
* 构建一个promise, 可以在任意时刻resolve或reject
* Usage:
* function delay(ms: number): Promise<void> {
const deferred = new Deferred<void>();
setTimeout(() => {
deferred.resolve();
}, ms);
return deferred.promise;
}
console.log("start");
delay(1000).then(() => {
console.log("after 1 second");
});
console.log("end");
*/
declare class Deferred<T = any> {
private _resolve;
private _reject;
readonly promise: Promise<T>;
constructor();
resolve(value: T | PromiseLike<T>): void;
reject(reason?: any): void;
then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null | undefined, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined): Promise<TResult1 | TResult2>;
catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<T | TResult>;
}
/**
* 简单限流的 Promise 队列
* Usage:
const q = new PromiseQueue();
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].forEach((v) => {
q.add(
() =>
new Promise((resolve) => {
setTimeout(() => {
console.log(v);
resolve();
}, 1000);
})
);
});
*/
declare class PromiseQueue {
private readonly concurrency;
private _current;
private _list;
constructor({ concurrency }: {
concurrency: number;
});
add(promiseFn: () => Promise<any>): void;
loadNext(): void;
onLoaded(): void;
}
export { Deferred, PromiseQueue, retry };