javascript - 如何同步执行socket.io端点

标签 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 连接(2 个不同的用户)同时调用。我不希望函数 PlaylistHandler.add_song 为每个函数并行运行,因此我尝试使用 async/await...

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

这没有解决任何问题,因为我怀疑这是因为有两个不同的 io 连接进行调用。

有没有办法让套接字调用本身顺序运行而不是并行运行?

最佳答案

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

最好/最简单的方法是在 add_song 的开头设置一个变量 calculated = true,并推迟任何 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;
}

关于javascript - 如何同步执行socket.io端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54846917/

相关文章:

javascript - 如何强制 Node 的请求模块不对响应进行编码?

javascript - 提交表单并更新父页面后关闭 javascript 弹出窗口吗?

node.js - 如何在 Express 中构造 app.configure

sockets - 套接字发送给特定用户

javascript - 多个 Vue.set() 不更新对象/DOM

javascript - jQuery 从 <a href 'Click Me' >Click Me</a> 中提取 ="http://example.com"

javascript - 使用 lodash trim 对象键

javascript - jquery初始化多个选项卡

Android:与服务器通信的最佳方式

java - 如何从Tomcat服务器向客户端发送数据?