Skip to content

promise

Promise 工具函数。

导入

typescript
import { 
  isPromiseLike, 
  promiseDelay, 
  promiseTimeout, 
  promiseWhen, 
  promiseShared, 
  createMinDelayPromise 
} from '@cloudcome/utils-core/promise'

函数

isPromiseLike

判断是否为类 Promise 对象。

typescript
function isPromiseLike<T>(unknown: unknown): unknown is Promise<T>

参数

参数类型描述
unknownunknown要检查的值

返回值

unknown is Promise<T> - 是否为类 Promise 对象

示例

typescript
isPromiseLike(Promise.resolve()) // true
isPromiseLike({ then: () => {} }) // true
isPromiseLike({}) // false
isPromiseLike(null) // false

promiseDelay

延迟执行。

typescript
function promiseDelay(ms?: number, ctrl?: AbortController): Promise<void>

参数

参数类型默认值描述
msnumber0延迟时间(毫秒)
ctrlAbortController-可选,用于取消延迟

返回值

Promise<void>

示例

typescript
// 基本用法
await promiseDelay(1000) // 延迟 1 秒

// 使用 AbortController 取消
const ctrl = new AbortController()
setTimeout(() => ctrl.abort(), 500) // 500ms 后取消
await promiseDelay(1000, ctrl) // 不会等待 1 秒

promiseTimeout

为 Promise 添加超时。

typescript
function promiseTimeout<T>(promise: Promise<T>, ms: number): Promise<T>

参数

参数类型描述
promisePromise<T>原始 Promise
msnumber超时时间(毫秒)

返回值

Promise<T> - 带超时的 Promise

示例

typescript
// 基本用法
const data = await promiseTimeout(fetch('/api/data'), 5000) // 5 秒超时

// 超时会抛出错误
try {
  await promiseTimeout(promiseDelay(10000), 1000) // 1 秒超时
} catch (error) {
  console.error('Timeout!') // 会执行这里
}

promiseWhen

等待条件满足。

typescript
function promiseWhen(condition: () => boolean, ms?: number): Promise<void>

参数

参数类型默认值描述
condition() => boolean-条件函数
msnumber10检查间隔(毫秒)

返回值

Promise<void>

示例

typescript
let count = 0
const interval = setInterval(() => {
  count++
}, 100)

// 等待 count >= 5
await promiseWhen(() => count >= 5, 50)
console.log(count) // >= 5

clearInterval(interval)

promiseShared

共享 Promise,避免重复请求。

typescript
function promiseShared<T>(promise: Promise<T>): Promise<T>

参数

参数类型描述
promisePromise<T>原始 Promise

返回值

Promise<T> - 共享的 Promise

示例

typescript
let callCount = 0
const fetchData = () => {
  callCount++
  return promiseDelay(100).then(() => 'data')
}

// 多次调用共享的 Promise
const shared = promiseShared(fetchData())
const [result1, result2] = await Promise.all([shared, shared])

console.log(result1) // 'data'
console.log(result2) // 'data'
console.log(callCount) // 1,只调用了一次

createMinDelayPromise

创建最小延迟函数。

typescript
function createMinDelayPromise(ms: number): () => Promise<void>

参数

参数类型描述
msnumber最小延迟时间(毫秒)

返回值

() => Promise<void> - 延迟函数

示例

typescript
const minDelay = createMinDelayPromise(500)

// 使用最小延迟
const start = Date.now()
await minDelay()
const elapsed = Date.now() - start
console.log(elapsed >= 500) // true

// 配合异步操作使用
const minDelay2 = createMinDelayPromise(1000)
async function loadData() {
  const delay = minDelay2()
  const data = await fetch('/api/data')
  await delay // 确保至少等待 1 秒
  return data
}

基于 MIT 许可发布