Reactjs 如何忽略通过HTTP进行更改的客户端的websocket事件?
我们有一个React应用程序,它使用REST获取和更新数据,使用Websocket接收更改通知 想象我们有一个集合/用户Reactjs 如何忽略通过HTTP进行更改的客户端的websocket事件?,reactjs,rest,http,websocket,architecture,Reactjs,Rest,Http,Websocket,Architecture,我们有一个React应用程序,它使用REST获取和更新数据,使用Websocket接收更改通知 想象我们有一个集合/用户 user1调用http方法POST/users来创建新用户 user1收到肯定的http响应,创建的用户被添加到UI列表中 user1还接收Websocket通知“user:created”,并再次尝试向UI列表添加新项 因此,由于HTTP响应和WS-event,进行调用的用户应该两次处理结果。这就是我试图解决的问题 几种可能的解决办法: 1.为调用POST/users的用户
有人经历过这样的问题吗?还有哪些解决方案可用?您基本上已经指出了最佳解决方案(2),但这里有一些选项
在我看来,最简单、最干净的方法就是忽略POST响应并等待WS事件——因为这些都是套接字,所以您不应该有任何UI问题或延迟。如果添加了用户的客户端发出事件,那么使用
// sending to all clients except sender
socket.broadcast.emit('broadcast', 'hello friends!');
这不会向客户端发出事件,您可以在react应用程序中使用逻辑来侦听套接字事件以及http请求的响应。
这将防止重复或坏数据
如果为同一个客户端打开多个选项卡,则初始化http请求的客户端选项卡将使用http响应更新状态列表,并且所有其他用户的选项卡或其他用户将接收套接字事件。一种方法是在请求中添加“幂等计数器”字段。基本上,它只是一个数字,每个请求都会递增,并存储在前端。对于每个成功的请求,后端需要使用相同的计数器进行应答 您的处理逻辑如下所示:
function onUserAdded(user, counter) {
if(current_counter < counter) {
console.log("User added");
current_counter++;
} else {
console.log("User not added");
}
}
添加的函数(用户、计数器){
如果(当前计数器<计数器){
console.log(“用户添加”);
当前_计数器++;
}否则{
console.log(“未添加用户”);
}
}
当前计数器=0
- 调用
,使用POST/users
,使用counter=current\u counter+1
->counter=1
用户添加的
- 使用
->计数器=1获取websocket通知
未添加用户