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
是第二个调用,等等