跳到主要内容

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​

ParameterType
optionsReachabilityOptions

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​

ParameterTypeDescription
errorunknown调用抛出的错误;调用成功时传 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');