使用异步回调处理事件

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 回调。

【讨论】:

太棒了。正在写一个队列系统,但这太简单了。

以上是关于使用异步回调处理事件的主要内容,如果未能解决你的问题,请参考以下文章

如何优雅的处理Nodejs中的异步回调

深入理解Node.js基于事件驱动的回调

Node.js 用回调处理一次性事件

boost::asio 学习

ES56对异步事件的处理方式

异步回调,事件,线程池与协程