使用异步回调处理事件
Posted
技术标签:
【中文标题】使用异步回调处理事件【英文标题】:Handling events with async callbacks 【发布时间】:2021-04-16 02:34:30 【问题描述】:如何使用 async/await 或其他技术在消息处理程序中使用异步回调?消息可以随时出现,因此在异步函数中处理一条消息时,另一条消息可以进入并更快地处理。如果消息的顺序很重要,这就是一个问题。
socket.on('message', async (msg) =>
if(msg === 1)
await doFirstThing();
else if (msg === 2)
await doSecondThing();
);
如果doFirstThing()
需要一段时间,doSecondThing()
的消息可能会进来并且处理得太快。我正在考虑添加到一个数组然后承诺它,但我不知道如何将另一个承诺推到“堆栈”上,可以这么说,如果另一个承诺(或更多)正在等待..
【问题讨论】:
【参考方案1】:您可以拥有一个持久的外部 Promise 变量,每次出现新消息时重新分配该变量以确保正确的顺序。
let prom = Promise.resolve();
socket.on('message', (msg) =>
prom = prom.then(() =>
if(msg === 1)
return doFirstThing(); // return the Promise instead of `await`
else if (msg === 2)
return doSecondThing();
).catch(handleErrors); // make sure to include this
);
您需要能够无限期地链接到 Promise,因此绝对不能拒绝 prom
- .catch
是必不可少的。
每次收到消息时,它都会等待最后一条消息完成处理,然后再运行新的.then
回调。
【讨论】:
太棒了。正在写一个队列系统,但这太简单了。以上是关于使用异步回调处理事件的主要内容,如果未能解决你的问题,请参考以下文章