首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何确保websocket回调的有序处理结果?

如何确保websocket回调的有序处理结果?
EN

Stack Overflow用户
提问于 2018-12-13 15:26:37
回答 1查看 44关注 0票数 0

我有一个应用程序,它监听websocket端点并处理从它接收到的数据并将其保存到数据库中。

当同时调用两个回调时(例如:一个任务可能开始处理,另一个任务可能开始处理和更新数据库,然后第一个任务可能更新数据库--因此最终数据库更新是无序的),就会出现争用条件的问题

我想到的解决方案是记录调用回调的确切时间,处理数据,然后将时间附加到传递给数据库的数据上,并在数据库中与上次更新时间进行比较,并采取相应的措施。我想到的一个可能的问题是,时间可能会被按顺序记录下来(例如:考虑第一个回调被调用的场景,然后调用第二个回调,然后记录时间,然后记录第一个回调的时间)。

你怎么做才是对的呢?解决这个问题的方法还是其他方法?

编辑:更具体地说,正如我打算使程序尽可能实时,我希望允许毫不拖延地处理最最新的回调(无需等待所有其他以前的回调完全处理),但要确保处理的最终结果(记录在数据库中)符合回调到达的顺序(没有损坏)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-13 15:43:07

您可以将数据处理程序回调返回到完成时的承诺。

每次从套接字获得新数据时,在处理它之前都要等待该承诺,然后存储下一个等待数据的承诺。

看起来是这样的:

代码语言:javascript
运行
复制
const ready = Promise.resolve();

socket.on(..., data => {
  ready = ready.then(() => processData(data);
});

这将不会对任何其他代码产生影响。

编辑:要在锁外执行昂贵的工作,可以编写

代码语言:javascript
运行
复制
socket.on(..., data => {
  const result = doExpensiveWork(data); // Returns a promise
  ready = Promise.all(result, ready).then(([result]) => insertData(result));
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53765102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档