UNPKG

@cloudcome/utils-core

Version:
1 lines 4.91 kB
{"version":3,"file":"promise.cjs","sources":["../src/promise.ts"],"sourcesContent":["import { isObject, isPromise } from './type';\n\n/**\n * 检查给定的值是否为 Promise 类似对象。\n * @param unknown - 要检查的值。\n * @returns 如果值是 Promise 类似对象,则返回 `true`,否则返回 `false`。\n */\nexport function isPromiseLike<T>(unknown: unknown): unknown is Promise<T> {\n return isPromise(unknown) || (isObject(unknown) && typeof (unknown as unknown as Promise<T>).then === 'function');\n}\n\n/**\n * 等待一定时间后解决 Promise\n * @param ms - 等待的毫秒数,默认为 0\n * @param ctrl - 可选的 AbortController,用于提前终止等待\n * @returns 一个 Promise,等待指定时间后解决\n */\nexport async function promiseDelay(ms = 0, ctrl?: AbortController) {\n return new Promise<void>((resolve) => {\n const t = setTimeout(resolve, ms);\n\n if (ctrl) {\n ctrl.signal.addEventListener('abort', () => {\n clearTimeout(t);\n resolve();\n });\n }\n });\n}\n\n/**\n * 使 Promise 在指定时间内执行,超时则拒绝\n * @param promise - 要执行的 Promise\n * @param ms - 超时的毫秒数\n * @returns 如果 Promise 在指定时间内解决,则返回其结果;否则抛出 \"timeout\" 错误\n * @throws {Error} 如果 Promise 超时,抛出 \"timeout\" 错误\n */\nexport async function promiseTimeout<T>(promise: Promise<T>, ms: number) {\n const ctrl = new AbortController();\n const result = await Promise.race([\n promise,\n promiseDelay(ms, ctrl).then(() => {\n throw new Error('timeout');\n }),\n ]);\n ctrl.abort();\n return result;\n}\n\n/**\n * 在指定条件满足时解决 Promise\n * @param condition - 一个返回布尔值的函数,用于检查条件是否满足\n * @param ms - 检查条件的时间间隔(毫秒),默认为 10\n * @returns 一个 Promise,在条件满足时解决\n */\nexport function promiseWhen(condition: () => boolean, ms = 10) {\n return new Promise<void>((resolve, reject) => {\n const check = () => {\n if (condition()) {\n resolve();\n } else {\n setTimeout(check, ms);\n }\n };\n\n check();\n });\n}\n\n/**\n * 创建一个与给定 Promise 共享状态的新 Promise。\n * 新的 Promise 不具备 resolve 或 reject 的能力,它仅反映原始 Promise 的状态。\n * @param promise - 要共享状态的原始 Promise。\n * @returns 一个新的 Promise,其状态与给定的 Promise 完全相同。\n * @example\n * const { promise: p1 } = Promise.withResolvers();\n * const sp1 = sharedPromise(p1);\n * const sp2 = sharedPromise(p1);\n * // 此时 sp1、sp2 完全共享 p1 的状态,自身并不具备 resolve 或 reject 的能力\n */\nexport function promiseShared<T>(promise: Promise<T>) {\n return new Promise<T>((resolve, reject) => {\n promise.then(resolve, reject);\n });\n}\n\n/**\n * 创建一个最小等待时间的函数\n * @param {number} ms - 最小等待时间(毫秒)\n * @returns {function} 返回一个异步函数,该函数会确保从 createMinDelayPromise 调用到其执行的时间至少为 ms 毫秒\n * @example\n * const end = createMinDelayPromise(1000);\n * // 执行一些操作\n * await end(); // 确保从 createMinDelayPromise 调用到这里的总时间至少为 1000 毫秒\n */\nexport function createMinDelayPromise(ms: number) {\n const startTime = Date.now();\n /**\n * 确保最小等待时间的结束函数\n * @async\n * @function end\n * @returns {Promise<void>} 在达到最小等待时间后解决\n */\n return async function end() {\n const endTime = Date.now();\n const waitTime = ms - (endTime - startTime);\n if (waitTime > 0) {\n await promiseDelay(waitTime);\n }\n };\n}\n"],"names":["isPromise","isObject"],"mappings":";;;AAOO,SAAS,cAAiB,SAAyC;AACjE,SAAAA,KAAA,UAAU,OAAO,KAAMC,KAAA,SAAS,OAAO,KAAK,OAAQ,QAAkC,SAAS;AACxG;AAQsB,eAAA,aAAa,KAAK,GAAG,MAAwB;AAC1D,SAAA,IAAI,QAAc,CAAC,YAAY;AAC9B,UAAA,IAAI,WAAW,SAAS,EAAE;AAEhC,QAAI,MAAM;AACH,WAAA,OAAO,iBAAiB,SAAS,MAAM;AAC1C,qBAAa,CAAC;AACN,gBAAA;AAAA,MAAA,CACT;AAAA,IAAA;AAAA,EACH,CACD;AACH;AASsB,eAAA,eAAkB,SAAqB,IAAY;AACjE,QAAA,OAAO,IAAI,gBAAgB;AAC3B,QAAA,SAAS,MAAM,QAAQ,KAAK;AAAA,IAChC;AAAA,IACA,aAAa,IAAI,IAAI,EAAE,KAAK,MAAM;AAC1B,YAAA,IAAI,MAAM,SAAS;AAAA,IAC1B,CAAA;AAAA,EAAA,CACF;AACD,OAAK,MAAM;AACJ,SAAA;AACT;AAQgB,SAAA,YAAY,WAA0B,KAAK,IAAI;AAC7D,SAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,UAAM,QAAQ,MAAM;AAClB,UAAI,aAAa;AACP,gBAAA;AAAA,MAAA,OACH;AACL,mBAAW,OAAO,EAAE;AAAA,MAAA;AAAA,IAExB;AAEM,UAAA;AAAA,EAAA,CACP;AACH;AAaO,SAAS,cAAiB,SAAqB;AACpD,SAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AACjC,YAAA,KAAK,SAAS,MAAM;AAAA,EAAA,CAC7B;AACH;AAWO,SAAS,sBAAsB,IAAY;AAC1C,QAAA,YAAY,KAAK,IAAI;AAO3B,SAAO,eAAe,MAAM;AACpB,UAAA,UAAU,KAAK,IAAI;AACnB,UAAA,WAAW,MAAM,UAAU;AACjC,QAAI,WAAW,GAAG;AAChB,YAAM,aAAa,QAAQ;AAAA,IAAA;AAAA,EAE/B;AACF;;;;;;;"}