ReachabilityMonitor
Defined in: packages/rxdb/src/network/reachability.ts:117
远端可达性监视器
Remarks
只在看到证据时翻转。成功的远端调用是在线的证据,isNetworkError 命中的失败 是离线的证据;除此之外一律不动状态 —— 包括退避节拍本身。退避节拍只是「现在可以再试一次」, 不是「已经恢复了」;乐观地把节拍当成恢复会让状态在断网期间反复抖动,UI 上表现为 待推计数不断闪回 0。
navigator.onLine 的两个方向不对称:false 可信为「一定离线」(网卡都没链路),
true 只说明有链路、不说明后端可达,所以只用来催一次尝试。
宿主监听是按需挂的:构造本身对宿主零副作用,要收 online / offline 事件得先
ReachabilityMonitor.watch。这两个事件唯一的消费者是同步链路,而同步随
@aiao/rxdb-plugin-sync 走(US-025 D2)—— 一个只配本地适配器、根本不同步的库不该因为
new RxDB() 就在 globalThis 上留下一对活过实例的监听器。report() 这条主判据与
退避节拍都不依赖它,不挂监听只是少了「浏览器自己说网回来了」这一路催促。
Example
const monitor = new ReachabilityMonitor();
// 远端调用出口统一上报
try {
const rows = await remote.findByIds('Recipe', ids);
monitor.report(null);
} catch (error) {
monitor.report(error);
throw error;
}
// 同步驱动订阅节拍,成功即恢复。先 watch() 才收得到浏览器的 online / offline
const unwatch = monitor.watch();
monitor.wakeup$.pipe(exhaustMap(() => flushPendingWrites())).subscribe();
Constructors
Constructor
new ReachabilityMonitor(options?): ReachabilityMonitor;
Defined in: packages/rxdb/src/network/reachability.ts:151
Parameters
| Parameter | Type |
|---|---|
options | ReachabilityOptions |
Returns
ReachabilityMonitor
Properties
online$
readonly online$: Observable<boolean>;
Defined in: packages/rxdb/src/network/reachability.ts:134
当前可达性判断的变化流(已去重,订阅即得当前值)
wakeup$
readonly wakeup$: Observable<void>;
Defined in: packages/rxdb/src/network/reachability.ts:144
「现在可以再试一次同步」的节拍
Remarks
离线期间按 base * 2 ** (attempt - 1) 退避发出(封顶 maxDelayMs),
浏览器 online 事件也会催发一次。订阅方应当用 exhaustMap 等单飞算子消费 ——
节拍可能与其它触发源叠加。
Accessors
online
Get Signature
get online(): boolean;
Defined in: packages/rxdb/src/network/reachability.ts:147
当前是否判为可达
Returns
boolean
Methods
destroy()
destroy(): void;
Defined in: packages/rxdb/src/network/reachability.ts:230
停止监视:摘掉事件监听、取消待发的节拍
Returns
void
Remarks
幂等。destroy() 之后 ReachabilityMonitor.report 不再改变状态。
report()
report(error): void;
Defined in: packages/rxdb/src/network/reachability.ts:213
上报一次远端调用的结果
Parameters
| Parameter | Type | Description |
|---|---|---|
error | unknown | 调用抛出的错误;调用成功时传 null |
Returns
void
Remarks
认不出的错误(含所有带数字 status 的 HTTP 响应)不改变状态:拿到了状态码
就说明连接是通的,401 / 422 / 503 都是远端给出的回答,不是网线断了。
watch()
watch(): () => void;
Defined in: packages/rxdb/src/network/reachability.ts:186
开始收宿主的 online / offline 事件
Returns
撤销本次订阅的函数;幂等,重复调用只算一次
() => void
Remarks
引用计数:第一位订阅者挂上监听,最后一位撤走才摘掉。同一个宿主上可能同时有多个 消费者,谁都不该因为另一个撤了就收不到事件。
每次从 0 变 1 都重读一次 navigator.onLine:挂监听的时机晚于构造(插件装在
connect() 里),这中间网线可能已经拔了,而拔掉那一刻没人在听。
退避节拍与引用计数同生共死:撤到 0 停拍,回到 1 且此刻离线就接着排。节拍只对
wakeup$ 的订阅方有意义,没人听还自我续期只是白占宿主的定时器。
destroy() 之后调用是空操作,返回一个什么都不做的撤销函数。
Example
// 插件作用域:装上时开始听,拆卸时自动摘掉
scope.acquire(() => rxdb.reachability.watch(), 'sync:reachability');