Skip to content

Commit 38aa3bd

Browse files
committed
fix: starting from v1.8 events are emitted synchronously
1 parent 093bd2e commit 38aa3bd

File tree

2 files changed

+14
-15
lines changed

2 files changed

+14
-15
lines changed

pages/docs/api/js.mdx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ Loro 是一款功能强大的无冲突复制数据类型(CRDT)库,可用
3939

4040
**事件与事务**
4141

42-
- 在 JS API 中,事件会在微任务之后异步触发
42+
- 在 JS API 中,事件会在提交 / 导入 / checkout 时同步触发(v1.8+)。仍停留在 <=1.7.x?请在读取批量事件前等待一个微任务。
4343
- import/export/checkout 会自动提交
4444
- Loro 事务不具备 ACID 特性——没有回滚 / 隔离
4545

@@ -649,7 +649,7 @@ const forkedDoc = doc.forkAt(frontiers);
649649

650650
## 事件与事务
651651

652-
响应变更,并将本地操作归组为事务。事件会在一个微任务之后异步派发。参见[事件处理](/docs/tutorial/event)[事务模型](/docs/concepts/transaction_model)
652+
响应变更,并将本地操作归组为事务。自 v1.8 起,事件会同步派发;较旧版本(<=1.7.x)需要等待一个微任务。参见[事件处理](/docs/tutorial/event)与[事务模型](/docs/concepts/transaction_model)。
653653

654654
### 订阅方法
655655

@@ -697,12 +697,12 @@ const unsubscribe = doc.subscribe((event) => {
697697
// 稍后再取消订阅
698698
```
699699

700-
**⚠️ 注意:** 事件会在一个微任务完成后异步派发
700+
**⚠️ 注意:** 自 v1.8 起事件会同步派发;如果仍使用 <=1.7.x,请在读取批量事件前等待一个微任务
701701

702702
```ts no_run
703703
doc.commit();
704-
await Promise.resolve();
705-
// 现在事件已经派发完毕
704+
// v1.8+ 会立即派发事件
705+
// await Promise.resolve(); // 仅在 <=1.7.x 需要等待
706706
```
707707

708708
**📝 提示:** commit 之前的多个操作会合并为一个事件。详见[事件处理](/docs/tutorial/event)。

pages/docs/tutorial/event.mdx

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Loro 内置事件系统用于追踪文档变化。本节介绍事件的触发时
1111
- 显式调用 `LoroDoc.commit()`
1212
- 在导入或导出前自动提交
1313

14-
事件会在微任务结束后异步触发。如果需要在提交后立即处理事件,请等待一个微任务
14+
`loro-crdt@1.8.0` 起,事件会在提交周期内同步触发;如果你仍使用 <=1.7.x,则需要等待一个微任务才能看到回调
1515

1616
```ts no_run twoslash
1717
import { LoroDoc } from "loro-crdt";
@@ -24,12 +24,11 @@ doc.subscribe((event) => {
2424
const text = doc.getText("text");
2525
text.insert(0, "Hello");
2626
doc.commit();
27-
// 事件尚未触发
28-
await Promise.resolve();
29-
// 事件现已触发
27+
// v1.8+ 已同步触发事件
28+
// await Promise.resolve(); // 仅在 <=1.7.x 仍需等待
3029
```
3130

32-
3. **导入**:调用 `import()` 导入远端更新时,会触发对应事件,便于本地响应其他节点的变更
31+
3. **导入**:调用 `import()` 导入远端更新时,会触发对应事件,便于本地响应其他节点的变更;在 v1.8+ 中会立即触发。
3332

3433
```ts no_run twoslash
3534
import { LoroDoc } from "loro-crdt";
@@ -40,19 +39,19 @@ doc.subscribe((event) => {
4039
console.log("Event:", event);
4140
});
4241

43-
doc.import(remoteChanges); // 微任务后触发事件
44-
await Promise.resolve();
42+
doc.import(remoteChanges); // v1.8+ 会立即触发事件
43+
// await Promise.resolve(); // 仅在 <=1.7.x 仍需等待
4544
```
4645

47-
4. **版本切换**:调用 `doc.checkout(frontiers)` 切换到其他版本时,同样会在微任务后触发事件
46+
4. **版本切换**:调用 `doc.checkout(frontiers)` 切换到其他版本时,同样会同步触发事件(v1.8+)
4847

4948
```ts no_run twoslash
5049
import { LoroDoc } from "loro-crdt";
5150
// ---cut---
5251
const doc = new LoroDoc();
5352
const frontiers = doc.frontiers();
54-
doc.checkout(frontiers); // 微任务后触发事件
55-
await Promise.resolve();
53+
doc.checkout(frontiers); // v1.8+ 会立即触发事件
54+
// await Promise.resolve(); // 仅在 <=1.7.x 仍需等待
5655
```
5756

5857
## 事务行为

0 commit comments

Comments
 (0)