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

Javascript 访问异步函数之外的变量时的JS安全性,javascript,multithreading,async-await,thread-safety,Javascript,Multithreading,Async Await,Thread Safety,我这里有一个异步函数,因为messageQueue是在外部更改的,我想知道这样写是否安全 this.messageQueue.push(message1); onChatMessage(); ... // some other code this.messageQueue.push(message2); onChatMessage(); ... // some other code this.messageQueue.push(message3); onChatMessage(); ... o

我这里有一个异步函数,因为
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;
},
this.messageQueue.push(message1);
onChatMessage();
... // 其他代码
this.messageQueue.push(message2);
onChatMessage();
... // 其他代码
this.messageQueue.push(message3);
onChatMessage();
...
onChatMessage:async函数(){
if(this.isProcessMsgQ){return;}
this.isProcessMsgQ=true;
for(设i=0;i
我担心的是,对于
thread1
,就在
this.messageQueue=[]之后和在此之前
this.isProcessMsgQ=false
,是否可以
thread2
完成将
message2
添加到队列的过程,进入
onChatMessage
,检查
this.isProcessMsgQ
,然后返回? 如果是的话,那么有一种情况是,Message2将不会被处理,有什么办法处理吗


谢谢

从for循环开始到设置this.messageQueue=[]
时,可能会丢失消息。重新分配
this.messageQueue
时,在此时间范围内添加的任何消息都将丢失。为了防止出现这种情况,请使用承诺跟踪消息执行的完成情况,在任何执行开始之前从一开始就刷新队列

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(()=>{}))
).然后(()=>{
this.isProcessMsgQ=false
})
},

在此之后不能运行任何其他内容。messageQueue=[];在此之前。isProcessMsgQ=false同步代码同步运行同样,什么是“线程1”和“线程2”。。。你在使用workers吗?JavaScript是单线程的。它只能安排将来调用的函数。在您的具体示例中,忽略
//其他一些代码
this.message=[]onChatMessage()
调用的code>直到最后一个
onChatMessage()
调用发生时才会执行。参见thread1和thread2,您是指对message1和message2分别调用
onChatMessage
?@Bravo,正如@richyton所说,
thread1
onChatMessage
的第一个调用,
thread2
是第二个调用,等等