访问异步函数之外的变量时的 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
})
},
我这里有一个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
})
},