1 line
4.7 KiB
Plaintext
1 line
4.7 KiB
Plaintext
{"version":3,"sources":["../../src/utils/promise.util.ts"],"sourcesContent":["type RetryOptions = {\n maxRetries: number\n whitelistErrors: Error[]\n}\n/**\n * Usage:\n * retry(() => fetch(\"https://example.com\"), { maxRetries: 3, whitelistErrors: [] })\n * .then((response) => console.log(response))\n * .catch((error) => console.error(error));\n * @param promiseFn\n * @param options\n * @returns\n */\nexport function retry<T>(promiseFn: () => Promise<T>, options: RetryOptions): Promise<T> {\n let retries = 0\n let defaultOptions = {\n maxRetries: 3,\n whitelistErrors: [],\n }\n Object.assign(defaultOptions, options)\n const { maxRetries, whitelistErrors } = options\n\n const retryPromise = async (): Promise<T> => {\n try {\n return await promiseFn()\n } catch (err) {\n if (\n retries < maxRetries &&\n whitelistErrors.some(whitelistedError => err instanceof whitelistedError.constructor)\n ) {\n retries++\n return retryPromise()\n }\n throw err\n }\n }\n\n return retryPromise()\n}\n/**\n * 构建一个promise, 可以在任意时刻resolve或reject\n * Usage:\n * function delay(ms: number): Promise<void> {\n const deferred = new Deferred<void>();\n\n setTimeout(() => {\n deferred.resolve();\n }, ms);\n\n return deferred.promise;\n }\n\n console.log(\"start\");\n\n delay(1000).then(() => {\n console.log(\"after 1 second\");\n });\n\n console.log(\"end\");\n */\nexport class Deferred<T = any> {\n private _resolve!: (value: T | PromiseLike<T>) => void\n private _reject!: (reason?: any) => void\n\n public readonly promise: Promise<T>\n\n constructor() {\n this.promise = new Promise<T>((resolve, reject) => {\n this._resolve = resolve\n this._reject = reject\n })\n }\n\n public resolve(value: T | PromiseLike<T>): void {\n this._resolve(value)\n }\n\n public reject(reason?: any): void {\n this._reject(reason)\n }\n\n public then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null | undefined,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined,\n ): Promise<TResult1 | TResult2> {\n return this.promise.then(onfulfilled, onrejected)\n }\n\n public catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined,\n ): Promise<T | TResult> {\n return this.promise.catch(onrejected)\n }\n}\n\n/**\n * 简单限流的 Promise 队列\n * Usage:\n const q = new PromiseQueue();\n [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].forEach((v) => {\n q.add(\n () =>\n new Promise((resolve) => {\n setTimeout(() => {\n console.log(v);\n resolve();\n }, 1000);\n })\n );\n});\n */\nexport class PromiseQueue {\n private readonly concurrency: number\n private _current: number = 0\n private _list: (() => Promise<any>)[] = []\n\n constructor({ concurrency = 2 }: { concurrency: number }) {\n this.concurrency = concurrency\n }\n\n add(promiseFn: () => Promise<any>) {\n this._list.push(promiseFn)\n this.loadNext()\n }\n\n loadNext() {\n if (this._list.length === 0 || this.concurrency === this._current) return\n this._current++\n const fn = this._list.shift()!\n const promise = fn.call(this)\n promise.then(this.onLoaded.bind(this)).catch(this.onLoaded.bind(this))\n }\n\n onLoaded() {\n this._current--\n this.loadNext()\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaO,SAAS,MAAS,WAA6B,SAAmC;AACvF,MAAI,UAAU;AACd,MAAI,iBAAiB;AAAA,IACnB,YAAY;AAAA,IACZ,iBAAiB,CAAC;AAAA,EACpB;AACA,SAAO,OAAO,gBAAgB,OAAO;AACrC,QAAM,EAAE,YAAY,gBAAgB,IAAI;AAExC,QAAM,eAAe,YAAwB;AAC3C,QAAI;AACF,aAAO,MAAM,UAAU;AAAA,IACzB,SAAS,KAAK;AACZ,UACE,UAAU,cACV,gBAAgB,KAAK,sBAAoB,eAAe,iBAAiB,WAAW,GACpF;AACA;AACA,eAAO,aAAa;AAAA,MACtB;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO,aAAa;AACtB;AAsBO,IAAM,WAAN,MAAwB;AAAA,EAM7B,cAAc;AACZ,SAAK,UAAU,IAAI,QAAW,CAAC,SAAS,WAAW;AACjD,WAAK,WAAW;AAChB,WAAK,UAAU;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEO,QAAQ,OAAiC;AAC9C,SAAK,SAAS,KAAK;AAAA,EACrB;AAAA,EAEO,OAAO,QAAoB;AAChC,SAAK,QAAQ,MAAM;AAAA,EACrB;AAAA,EAEO,KACL,aACA,YAC8B;AAC9B,WAAO,KAAK,QAAQ,KAAK,aAAa,UAAU;AAAA,EAClD;AAAA,EAEO,MACL,YACsB;AACtB,WAAO,KAAK,QAAQ,MAAM,UAAU;AAAA,EACtC;AACF;AAkBO,IAAM,eAAN,MAAmB;AAAA,EAKxB,YAAY,EAAE,cAAc,EAAE,GAA4B;AAH1D,SAAQ,WAAmB;AAC3B,SAAQ,QAAgC,CAAC;AAGvC,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,IAAI,WAA+B;AACjC,SAAK,MAAM,KAAK,SAAS;AACzB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,WAAW;AACT,QAAI,KAAK,MAAM,WAAW,KAAK,KAAK,gBAAgB,KAAK,SAAU;AACnE,SAAK;AACL,UAAM,KAAK,KAAK,MAAM,MAAM;AAC5B,UAAM,UAAU,GAAG,KAAK,IAAI;AAC5B,YAAQ,KAAK,KAAK,SAAS,KAAK,IAAI,CAAC,EAAE,MAAM,KAAK,SAAS,KAAK,IAAI,CAAC;AAAA,EACvE;AAAA,EAEA,WAAW;AACT,SAAK;AACL,SAAK,SAAS;AAAA,EAChB;AACF;","names":[]} |