【问题标题】: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() 的消息可能会进来并且处理得太快。我正在考虑添加到一个数组然后承诺它,但我不知道如何将另一个承诺推到“堆栈”上,可以这么说,如果另一个承诺(或更多)正在等待..

【问题讨论】:

    标签: javascript


    【解决方案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 回调。

    【讨论】:

    • 太棒了。正在写一个队列系统,但这太简单了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 2017-05-06
    • 2011-09-11
    • 2011-08-03
    相关资源
    最近更新 更多