我在我的 express 服务器中使用 socket.io 和 mongoose。
我的套接字正在使用以下代码监听事件:
socket.on('do something', async () => {
try {
await doA();
doX();
await doB();
doY();
await doC();
} catch (error) {
console.log(error);
}
});
doA
、doB
和 doC
是使用 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/