javascript - socket.io 和异步事件
问题描述
我在我的快递服务器中使用 socket.io 和猫鼬。
我的套接字正在使用以下代码监听事件:
socket.on('do something', async () => {
try {
await doA();
doX();
await doB();
doY();
await doC();
} catch (error) {
console.log(error);
}
});
doA
,doB
并且doC
是使用猫鼬在数据库上写入的异步操作,但通常它们可以是任何返回承诺的方法。
我希望“做某事”同步运行。如果事件队列同时处理更多事件,我的 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);
推荐阅读
- android - 从 sqlite 获取数据并在表格视图中显示
- asp.net - 无法从远程计算机查看我的 IIS 托管站点,但 IIS 页面打开
- mysql - Wamp - 不能使用其他版本的 MySQL (v5.7.19 -> 其他版本)
- owl - OWL 限制值 vs 仅 vs 完全在 dataProperty
- ansible - Ansible:遍历多个单独的列表
- kubernetes - 列出 etcd 成员时看到错误的客户端 URL
- javascript - 从 JSON Schema [Angular 8] 动态创建表单
- google-cloud-platform - Google Cloud Scheduler - 自动化所有项目
- mongodb - Mongodb:如何列出字段的类型?
- ios - MKwebview:在隐式展开可选值时意外发现 nil