# `createDraft` and `finishDraft`

URL: https://caijiao.org/immer/guide/async
Source: docs/immer/guide/async.md
Description: 了解 Immer 中 createDraft 和 finishDraft 函数的使用方法，以及如何处理异步更新。

`createDraft` 和 `finishDraft` 是两个底层函数，它们对于在 immer 之上构建抽象的库非常有用。它避免了为了使用 draft 始终创建函数。相反，人们可以创建一个 draft，对其进行修改，并在未来的某个时间完成该 draft，在这种情况下，将产生下一个不可变状态。

除此之外，`createDraft` / `finishDraft` 还可以用于表达对 draft 的异步更新：

```javascript
import {createDraft, finishDraft} from "immer"

const user = {
	name: "michel",
	todos: []
}

const draft = createDraft(user)
draft.todos = await (await window.fetch("http://host/" + draft.name)).json()
const loadedUser = finishDraft(draft)
```

注意：`finishDraft` 以一个 `patchListener` 作为第二个参数，可以用来记录 patches，类似于 `produce`

_警告：一般情况下，我们建议使用 `producer` 而不是 `createDraft / finishDraft` 组合，`produce` 在使用中不易出错，并且在代码中更清楚地区分了可变性和不变性的概念。_
