我有一个应用程序,它侦听websocket端点,处理从中接收的数据并将其保存到数据库。
当同时调用两个回调时,就会出现争用条件的问题(例如:一个任务可能开始处理,然后另一个任务可以开始处理并更新数据库,然后第一个任务可能更新数据库,所以最终数据库更新不正常(。
我想到的解决方案是记录调用回调的确切时间,处理数据,然后将时间附加到传递到数据库的数据上,并在数据库中将此时间与上次更新时间进行比较,并采取相应行动。我想到的一个可能的问题是时间可能被无序记录(例如:考虑这样的场景:调用第一个回调,然后调用第二个回调并记录时间,然后记录第一个回调的时间(。
你会怎么做才是正确的方式?这个问题的解决方案或其他解决方法?
编辑:更具体地说,由于我希望程序尽可能实时,我希望能够毫不延迟地处理最新的回调(无需等待所有其他以前的回调完全处理(,但要确保处理的最终结果(记录在数据库中(符合回调的顺序到达(未损坏(
数据处理程序回调可以返回完成时的承诺。
每次从套接字中获取新数据时,在处理该promise之前,请等待该promise,然后将生成的promise存储为下一个要等待的数据。
看起来是这样的:
const ready = Promise.resolve();
socket.on(..., data => {
ready = ready.then(() => processData(data);
});
这对任何其他代码都没有影响。
编辑:要在锁外完成昂贵的工作,可以编写
socket.on(..., data => {
const result = doExpensiveWork(data); // Returns a promise
ready = Promise.all(result, ready).then(([result]) => insertData(result));
});