【问题标题】:JS: Executing events overlapping in time afteranotherJS:执行时间重叠的事件
【发布时间】:2021-03-05 09:49:44
【问题描述】:

我以正确的顺序即时接收事件,我希望按照正确的顺序依次处理它们(以及即时 - 所以不要先“存储”它们)。

以下示例无法正常工作,因为函数someEventOccured() 可能在非常接近的时间跨度内被多次调用。因此,handleEvent 的执行将在时间上重叠(我不想要)。当我正在写入handleEvent() 中的文件时,我不能同时执行该功能并且需要维护顺序...

async someEventOccured(data:string){
   await handleEvent(data);
}

我已经尝试过使用 .then() 并存储承诺,但是我不知道如何等待前一个 .then() 完成...

非常感谢您的帮助

【问题讨论】:

    标签: javascript promise es6-promise


    【解决方案1】:

    一般的方法是有一个共享的承诺来排队:

    let queue = Promise.resolve();
    function someEventOccured(data:string) {
      queue = queue.then(() => {
        return handleEvent(data);
      }).catch(err => {
        // ensure `queue` is never rejected or it'll stop processing events
        // …
      });
    }
    

    当然,这确实将data 事件隐式存储在承诺链上的闭包中。

    【讨论】:

    • 如果handleEvent是异步的呢?
    • @MartinDallinger 它将起作用,因为它的承诺将被包装到 .then 中,它会自动等待它......
    • @MartinDallinger handleEvent 预计是异步的并返回一个promise,否则整个排队是没有意义的
    • 谢谢——现在说得通了——我只是不习惯这种语法,结果有点困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    相关资源
    最近更新 更多