---
title: "onceAsync"
description: "包装异步函数使其只执行一次，并发共享结果，失败后允许重试"
canonical_url: "https://core.mhaibaraai.cn/docs/utilities/async/once-async"
---
# onceAsync

> 包装异步函数使其只执行一次，并发共享结果，失败后允许重试

## 用法

`onceAsync` 返回一个新函数：首次调用执行原函数，并发调用复用同一个 Promise，成功后缓存结果；失败时清除缓存，下次调用重新执行。

```ts
import { onceAsync } from '@movk/core'

// 可选依赖只加载一次
const loadPmtiles = onceAsync(() => import('pmtiles'))

const [a, b] = await Promise.all([loadPmtiles(), loadPmtiles()])
a === b // true

// 一次性注册
const register = onceAsync(async () => {
  const { Protocol } = await loadPmtiles()
  addProtocol('pmtiles', new Protocol().tile)
})
```

## API

### `onceAsync(fn)`

包装异步函数，使其只执行一次并共享结果。

### 参数

**fn** (`() => Promise<T>`) *required*: 待包装的异步函数，同步抛出的错误同样以 reject 返回。

### 返回值

**返回值** (`() => Promise<T>`): 返回共享 Promise 的函数。

## Changelog

See commit history for [src/utilities/async/onceAsync.ts](https://github.com/mhaibaraai/movk-core/commits/main/src/utilities/async/onceAsync.ts).

---

- [GitHub](https://github.com/mhaibaraai/movk-core/blob/main/src/utilities/async/onceAsync.ts)


## Sitemap

See the full [sitemap](https://core.mhaibaraai.cn/sitemap.md) for all pages.
