访问异步函数之外的变量时的 JS 安全性

JS safety when accessing variables outside of the async function

我这里有一个async函数,因为messageQueue是在外面改的,所以我想知道这样写是否安全。

this.messageQueue.push(message1);
onChatMessage();
... // some other code
this.messageQueue.push(message2);
onChatMessage();
... // some other code
this.messageQueue.push(message3);
onChatMessage();
...

onChatMessage: async function () {
    if (this.isProcessMsgQ) { return; }
    this.isProcessMsgQ = true;
    for (let i = 0; i < this.messageQueue.length; i++) {
        const msg = this.messageQueue[i];
        try {
            await this.processMessage(msg);
        } catch (err) {
        }
    }
    this.messageQueue = [];
    this.isProcessMsgQ = false;
},

我担心的是,对于 thread1,就在 this.messageQueue = []; 之后和 this.isProcessMsgQ = false; 之前,thread2 能否完成将 message2 添加到队列,进入 onChatMessage,检查 this.isProcessMsgQ,和 return? 如果是的话,那么就是messsage2不会被处理的情况,有什么办法处理吗?

谢谢!

在 for 循环开始和设置 this.messageQueue = [] 之间可能会丢失消息。当您重新分配 this.messageQueue 时,在该时间范围内添加的任何消息都将丢失。为防止这种情况,请使用 Promise 来跟踪消息执行的完成情况,在任何执行开始之前的最开始刷新队列。

onChatMessage: function () {
    if (this.isProcessMsgQ) { return; }
    this.isProcessMsgQ = true;
    const tmp = this.messageQueue
    this.messageQueue = []
    this.executingAll = Promise.all(
      tmp.map(msg => this.processMessage(msg).catch(() => {}))
    ).then(() => {
      this.isProcessMsgQ = false
    })
},