# defer

URL: https://caijiao.org/radash/async/defer
Source: docs/radash/async/defer.md
Description: 运行带有延迟函数的异步函数 '_.defer' 函数允许您运行一个异步函数，同时注册一些函数，这些函数会延迟到异步函数完成后再执行

运行带有延迟函数的异步函数




## 基本用法

`_.defer` 函数允许您运行一个异步函数，同时注册一些函数，这些函数会延迟到异步函数完成后再执行。这在那些在特定点之前或之后失败需要清理的脚本中非常有用。它有点像 `finally` 块。

灵感来自 Swift 的 `defer`。

传递给 `_.defer` 的函数会接收一个 `register` 函数参数，该参数可用于注册您希望在函数完成时调用的工作。如果您的函数抛出错误，然后注册的清理函数也抛出错误，默认情况下该错误会被忽略。register 函数支持一个可选的第二个 `options` 参数，让您可以配置重抛策略，以便清理函数中的错误被重新抛出。

```ts
import { defer } from 'radash'

await defer(async (cleanup) => {
  const buildDir = await createBuildDir()

  cleanup(() => fs.unlink(buildDir))

  await build()
})

await defer(async (register) => {
  const org = await api.org.create()
  register(async () => api.org.delete(org.id), { rethrow: true })

  const user = await api.user.create()
  register(async () => api.users.delete(user.id), { rethrow: true })

  await executeTest(org, user)
})
```
