Far*_*lam 8 networking typescript angular
我正在尝试编写一个组件来检测应用程序是在线还是离线,以便它可以触发另一个事件.是否有可以利用的内置功能?
Bee*_*ice 12
要收到有关在线或离线的应用程序的通知,请依赖在线/离线事件
online$ = fromEvent(window, 'online');
offline$ = fromEvent(window, 'offline');
Run Code Online (Sandbox Code Playgroud)将您的其他活动链接到这些:
online$.subscribe(e => this.syncWithServer());
Run Code Online (Sandbox Code Playgroud)
另见本文navigator.onLine
.请注意,浏览器不会统一实现此事件.在某些情况下,"在线"只意味着浏览器连接到本地网络,而不是互联网.要获得更可靠的信息,您可能需要在事件触发时尝试ping远程服务器进行测试.
online$ = fromEvent(window, 'online').pipe(
switchMap(e => this.pingServer()),
filter(e => e)
);
offline$ = fromEvent(window, 'offline').pipe(
switchMap(e => this.pingServer()),
filter(e => !e)
);
Run Code Online (Sandbox Code Playgroud)
pingServer
将在何处发出远程请求并返回true
在请求成功时发出的observable,false
否则返回.
侦听网络状态的安全方法
上面给出的答案效果很好,但不被认为是安全的方法。
1.不应该直接引用浏览器依赖的对象,始终检查平台。
2.其他功能如网络连接必须封装到服务中。
下面是可以订阅以监听网络状态的 ConnectionService。它遵循 rxjs 6 风格。
完整代码
import { Injectable, Inject, PLATFORM_ID } from '@angular/core';
import { Observable, fromEvent, merge, EMPTY } from 'rxjs';
import { isPlatformBrowser } from '@angular/common';
import { mapTo } from 'rxjs/operators';
@Injectable({
providedIn: 'root'
})
export class ConnectionService {
private connectionMonitor: Observable<boolean>;
constructor(@Inject(PLATFORM_ID) platform) {
if (isPlatformBrowser(platform)) {
const offline$ = fromEvent(window, 'offline').pipe(startWith(!window.navigator.onLine), mapTo(false));
const online$ = fromEvent(window, 'online').pipe(startWith(window.navigator.onLine), mapTo(true));
this.connectionMonitor = merge(
offline$, online$
);
} else {
this.connectionMonitor = EMPTY;
}
}
monitor(): Observable<boolean> {
return this.connectionMonitor;
}
}
Run Code Online (Sandbox Code Playgroud)
在组件中,您可以通过订阅 monitor() 或使用异步管道直接进入 HTML 来监听。