Skip to content

Commit d98ba09

Browse files
author
CodeBuddy Attribution Bot
committed
fix(attribution): 实时监听 API 缺乏初始数据就绪通知机制 (issue_mnrzm5ru_70sm9m)
1 parent 6ea1cf4 commit d98ba09

1 file changed

Lines changed: 44 additions & 2 deletions

File tree

config/source/skills/no-sql-web-sdk/realtime.md

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,40 @@ Create a real-time data listener that returns a `watcher` object.
8888
- `add`: New document added
8989
- `delete`: Document deleted
9090

91+
## Initial Readiness Contract
92+
93+
Calling `.watch()` only starts the listener setup. Do not assume the queried data is ready immediately after `watch()` returns.
94+
95+
- Treat the first `onChange` snapshot whose `docChanges` contain `dataType: 'init'` as the canonical "initial data is ready" signal.
96+
- Until that `init` snapshot arrives, keep loading state explicit.
97+
- Do not enable turn-based actions, render room state as authoritative, or conclude that the query returned no rows before the `init` snapshot.
98+
99+
Example:
100+
101+
```javascript
102+
let initialReady = false;
103+
104+
const watcher = db.collection("rooms")
105+
.where({ roomId })
106+
.watch({
107+
onChange(snapshot) {
108+
const isInit = snapshot.docChanges?.some(
109+
change => change.dataType === 'init'
110+
);
111+
112+
syncRoomState(snapshot.docs);
113+
114+
if (isInit && !initialReady) {
115+
initialReady = true;
116+
setLoading(false);
117+
}
118+
},
119+
onError(error) {
120+
handleWatchError(error);
121+
}
122+
});
123+
```
124+
91125
**Watcher object methods:**
92126
- `watcher.close()`: Close monitoring and release resources
93127
@@ -120,10 +154,18 @@ import { useEffect } from 'react';
120154

121155
function ChatRoom({ roomId }) {
122156
useEffect(() => {
157+
let initialReady = false;
123158
const watcher = db.collection("messages")
124159
.where({ chatRoomId: roomId })
125160
.watch({
126-
onChange: handleNewMessages,
161+
onChange(snapshot) {
162+
handleNewMessages(snapshot);
163+
164+
if (!initialReady && snapshot.docChanges?.some(change => change.dataType === 'init')) {
165+
initialReady = true;
166+
setLoading(false);
167+
}
168+
},
127169
onError: handleError
128170
});
129171

@@ -133,4 +175,4 @@ function ChatRoom({ roomId }) {
133175
};
134176
}, [roomId]);
135177
}
136-
```
178+
```

0 commit comments

Comments
 (0)