javascript - socket.io 和异步事件

标签 javascript asynchronous mongoose socket.io

我在我的 express 服务器中使用 socket.io 和 mongoose。

我的套接字正在使用以下代码监听事件:

socket.on('do something', async () => {
  try {
    await doA();
    doX();
    await doB();
    doY();
    await doC();
  } catch (error) {
    console.log(error);
  }
});

doAdoBdoC 是使用 mongoose 写入数据库的异步操作,但通常它们可以是返回 promise 的任何方法.

我希望“做某事”同步运行。 如果事件队列同时处理更多事件,我的 mongodb 就会出现一致性问题。

换句话说,如果服务器接收到两个“做某事”事件,我希望接收到的第二个事件仅在第一个事件完全处理后才被处理(在 await doC 之后)。不幸的是,“做某事”回调是异步的。

如何处理?

最佳答案

可以通过将要运行的函数添加到数组中,然后一个一个地运行它们来实现队列。我在下面创建了一个示例。

let queue = [];
let running = false;

const delay = (t, v) => {
   return new Promise((resolve) => { 
       setTimeout(resolve.bind(null, "Returned value from Promise"), t)
   });
}

const onSocketEvent = async () => {
  console.log("Got event");
  if (!running) {
    console.log("Nothing in queue, fire right away");
    return doStuff();
  }
  // There's something in the queue, so add it to it
  console.log("Queuing item")
  queue.push(doStuff);
}

const doStuff = async () => {
  running = true;
  const promiseResult = await delay(2000);
  console.log(promiseResult);
  
  if (queue.length > 0) {
    console.log("There's more in the queue, run the next one now")
    queue.shift()();
  } else {
    console.log("Queue empty!")
    running = false;
  } 
}

onSocketEvent();
setTimeout(() => onSocketEvent(), 1000);
setTimeout(() => onSocketEvent(), 1500);
setTimeout(() => onSocketEvent(), 2000);
setTimeout(() => onSocketEvent(), 2500);

关于javascript - socket.io 和异步事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55512609/

相关文章:

javascript - 恶意软件将代码注入(inject)我的 Dojo/WebSocket 应用程序 : how prevent?

c++ - OpenCL 内核是异步执行的吗?

javascript - 使用javascript读取和写入外部文件?

javascript - 使用 AngularJS 从两个不同的 $scopes 添加数字

c# - System.Diagnostics.Process.Start 奇怪的行为

c# - 为什么 async/await 允许从 List 到 IEnumerable 的隐式转换?

node.js - Mongoose:如何实现分页?

javascript - 如何在 MongoDB 中修改动态添加的文档字段

node.js - 保存多个模型 Mongoose

javascript - 弹性索引.html 模板