gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:06:24 27 4
gpt4 key购买 nike

我在这里有一个异步函数,因为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并返回的过程?
如果是,那么有可能不会处理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
})
},

关于javascript - 访问异步函数之外的变量时的JS安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64995716/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com