gpt4 book ai didi

javascript - 将 websocket 事件转换为可观察对象

转载 作者:行者123 更新时间:2023-11-30 11:13:15 25 4
gpt4 key购买 nike

我正在使用 ws library创建一个 websocket 客户端与(基于 JSON 的)websocket 服务器通信。每个请求都必须有一个唯一的 requestId,响应也会有相同的 requestId

我的代码的简化示例

let requestId = 0;

const WebSocket = require('ws');
const ws = new WebSocket('ws://www.host.com/path');

ws.on('message', (json) => {
let obj = JSON.parse(json);

if (obj.eventType === 'SomeEvent') {
ws.send({
requestId,
command: "DoSomeStuff"
});
}
});

我想在我的文件中实现一个发送方法,该方法在内部调用 ws.send() 但返回一个可观察对象,当 websocket 收到 ws.on('message' ) 其中 requestId 属性与 requestId 匹配。

这样我就可以订阅 Observable 并将我的代码更改为

...
if (obj.eventType === 'SomeEvent') {
mySendFunction({
requestId,
command: "DoSomeStuff"
}).subscribe(result => {
// Do something with result here
}
}
...

此外 - 有时(很少)服务器不响应请求。在那种情况下,如果在给定时间段内未收到响应,是否有办法使可观察对象超时?


我见过使用数组将 requestId 映射到 promises 然后手动解析它们的实现,但我认为必须有一种更聪明的方法来直接使用 RxJS 来执行此操作。

有什么想法吗?

最佳答案

您可以做的一件非常简单的事情就是使用 new Observable():

const mySendFunction = options => new Observable(observer => {
const handler = ws.on('message', json => {
let obj = JSON.parse(json);

if (obj.eventType === options.command) {
observer.next(obj);
observer.complete();
}
});

ws.send(options);

return () => {
// ...cancel handler?
};
});

关于javascript - 将 websocket 事件转换为可观察对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52738422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com