如何同步执行socket.io端点

时间:2019-02-23 22:32:10

标签: javascript node.js sockets asynchronous socket.io

我的应用程序正在使用 socket.io ,据我收集, socket.io 是异步执行的。在大多数情况下,这不是问题,但是在特定情况下,我的应用程序中的2个用户可能会同时调用同一套接字终结点,这会导致问题。

我希望每个套接字端点都等到它执行完毕之前再执行。如果它们异步运行,我会得到意想不到的结果。

在服务器上,我有以下内容...

// Establish a connection with a WebSocket.
io.on("connection", socket => {

  socket.on("add_song", async (data) => {
    PlaylistHandler.add_song(io, socket, data);      
  });

...
...

add_song被两个不同的io连接(两个不同的用户)同时调用。我不希望函数PlaylistHandler.add_song并行运行,所以我尝试使用 async / await ...

await PlaylistHandler.add_song(io, socket, data);

那并没有解决任何问题,因为我怀疑是因为有两个不同的io连接进行了呼叫。

有什么方法可以让套接字调用本身按顺序而不是并行运行?

1 个答案:

答案 0 :(得分:1)

await不会阻止事件循环,因此在这里确实无关紧要。两个await PlaylistHandler.add_song都将在各自的io.on侦听器中并行执行。

最好/最简单的方法是在calculating = true的开头设置一个变量add_song,如果我们已经在做add_song,则将其推迟。

希望此代码段可以激发您实现可行的解决方案:

let calculating = false;

function add_song(io, socket, data){
    if(calculating){
        setTimeout(function(){
            add_song(io, socket, data)
        }, 500); //depends on how often you want to check, reduce/increase timeout depending on how time-sensitive checking should be       
        return;
    }
    calculating = true;

    //Do all your usual add_song processing

    //After final operation of add_song
    calculating = false;
}