首页 > 解决方案 > 使用异步回调处理事件

问题描述

如何使用 async/await 或其他技术在消息处理程序中使用异步回调?消息可以随时出现,因此在异步函数中处理一条消息时,另一条消息可以进入并更快地处理。如果消息的顺序很重要,这是一个问题。

socket.on('message', async (msg) => {
   if(msg === 1){
      await doFirstThing();
   }
   else if (msg === 2){
      await doSecondThing();
   }
});

如果doFirstThing()需要一段时间,则消息doSecondThing()可能会进来并且处理得太快。我正在考虑添加到一个数组然后承诺它,但我不知道如何将另一个承诺推到“堆栈”上,可以这么说,如果另一个承诺(或更多)正在等待..

标签: javascript

解决方案


您可以拥有一个持久的外部 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回调运行之前等待最后一条消息完成处理。


推荐阅读