angular - 从 WebSocketSubject 反序列化 Blob 对象
问题描述
我正在尝试使用WebSocketSubject
. rxjs
我已经将大部分基本代码设置为 Angular 服务,如下所示:
import { Injectable } from '@angular/core';
import { webSocket, WebSocketSubject } from 'rxjs/webSocket';
import { Subscription, from, Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class WebsocketsApiService {
connection: WebSocketSubject<any>;
constructor() {
this.connection = webSocket({
url: <websocket URL>,
closeObserver: {
next: () => console.log('Sockets disconnected.')
},
openObserver: {
next: () => console.log('Socket connected.')
}
});
}
connect(observer: (value: any) => void): Subscription {
return this.connection.subscribe(observer);
}
send(data: any) {
if (this.connection) {
this.connection.next(data);
} else {
console.error('Websockets not connected');
}
}
close() {
if (this.connection) {
this.connection.complete();
this.connection = null;
}
}
ngOnDestroy() {
this.close();
}
}
但是,使用此基本代码,它无法反序列化来自 websocket 连接的任何数据。调试后,我注意到它以 . 的形式接收数据Blob
,这就是默认解串器功能JSON.parse(data)
失败的原因。
我尝试通过将Blob
数据获取为字符串来滚动一个简单的自定义反序列化器函数,但事实证明这Blob.text()
是一个 Promise,这是我被卡住的部分:
constructor() {
this.connection = webSocket({
/// ...
deserializer: (e) => e.data.text()
});
}
因此,使用此函数作为反序列化器,订阅此 Websocket 服务的每个组件都将获得一个字符串的 Promise,这会将解析 Promise 的责任推迟给组件。
问题:
- 这种当前的方法是否理想?让每个订阅组件自己解决承诺?
- 有没有更简洁的方法,最好是 websocket 订阅者立即解析 JSON 对象,而不是字符串订阅者必须单独解析?
解决方案
mergeAll/mergeMap
您可以使用, concatAll/concatMap
,映射到内部 Promise 的值switchAll/switchMap
。您可能希望concatAll/concatMap
按照它们进入的顺序发出值。
constructor() {
this.connection = webSocket({
/// ...
deserializer: (e) => e.data.text()
});
}
connect(observer: (value: any) => void): Subscription {
return this.connection.pipe(
concatAll()
).subscribe(observer);
}
或者
constructor() {
this.connection = webSocket({
/// ...
deserializer: ({data}) => data
});
}
connect(observer: (value: any) => void): Subscription {
return this.connection.pipe(
concatMap(data => data.text())
).subscribe(observer);
}
推荐阅读
- c# - 从 startup.cs 检查令牌有效性
- java - java:将字符串转换为希腊字符
- python - Python Flask:单击通过单击另一个按钮呈现的按钮
- javascript - 单击按钮时触发键盘事件
- hibernate - 使用 Hibernate 创建表
- python-3.x - 在networkx中按顺序获取源的祖先
- java - 如何获取在使用 Selenium 路由到另一个 url 之前临时出现的重定向 url?
- angular - 如何从angular4中的表单中删除formGroup?
- asp.net - 如何在 asp.net 中将 Fileupload 绑定到 Image 控件
- android - 如何从本地sqlite糖数据库android中检索数据