如何避免在刷新存储在 Promise.all() 中的数组时可能发生的内存泄漏
How to avoid possible memory leak at flushing an array stored in Promise.all()
我正在玩邮件发送逻辑,下面的代码按预期工作:它为每个收件人构建一个电子邮件内容并将其发送给一个人:
recipients.forEach((recipient) => {
orders.forEach((order) => {
if (order.ownerID === recipient.userID) {
emailContent.blocks.push({
content: "%EMAIL_TEXT%"
});
}
});
promises.push(mailer.sendEmail(recipient, emailContent));
emailContent.blocks = [];
});
await Promise.all(promises);
唯一有问题的是他们在开始构建新电子邮件之前刷新数组的方式:
emailContent.blocks = [];
我将 emailContent.blocks
的原始内容存储在 promises 数组中,然后将新数组分配给 emailContent.blocks
,从而将其发送到 mailer.sendEmail()
。 理论上可能会导致内存泄漏。
在这种情况下,我需要特别注意被遗弃的 emailContent.blocks
吗?或者在完成 await Promise.all(promises);
并退出函数垃圾收集器后就可以完成这项工作?
我只是想确保此代码不会产生内存泄漏。
看起来很像垃圾收集器要清理的东西。
我会更担心在你刚刚将 emailContent
发送到 mailer.sendMail
之后更改 emailContent.blocks
。
由于 emailContent
是通过引用发送的,设置 emailContent.blocks = []
将更改 mailer.sendMail
中的值。
它现在可能会工作,但如果 sendMail
变得异步(或变得更慢),那么您将遇到一些非常难以解决的错误。
不确定 emailContent
变量背后的内容,但我建议尽可能在每个循环中创建一个新的 emailContent
变量。
正如 Andreas 所建议的,在有疑问时使用分析器。
我正在玩邮件发送逻辑,下面的代码按预期工作:它为每个收件人构建一个电子邮件内容并将其发送给一个人:
recipients.forEach((recipient) => {
orders.forEach((order) => {
if (order.ownerID === recipient.userID) {
emailContent.blocks.push({
content: "%EMAIL_TEXT%"
});
}
});
promises.push(mailer.sendEmail(recipient, emailContent));
emailContent.blocks = [];
});
await Promise.all(promises);
唯一有问题的是他们在开始构建新电子邮件之前刷新数组的方式:
emailContent.blocks = [];
我将 emailContent.blocks
的原始内容存储在 promises 数组中,然后将新数组分配给 emailContent.blocks
,从而将其发送到 mailer.sendEmail()
。 理论上可能会导致内存泄漏。
在这种情况下,我需要特别注意被遗弃的 emailContent.blocks
吗?或者在完成 await Promise.all(promises);
并退出函数垃圾收集器后就可以完成这项工作?
我只是想确保此代码不会产生内存泄漏。
看起来很像垃圾收集器要清理的东西。
我会更担心在你刚刚将 emailContent
发送到 mailer.sendMail
之后更改 emailContent.blocks
。
由于 emailContent
是通过引用发送的,设置 emailContent.blocks = []
将更改 mailer.sendMail
中的值。
它现在可能会工作,但如果 sendMail
变得异步(或变得更慢),那么您将遇到一些非常难以解决的错误。
不确定 emailContent
变量背后的内容,但我建议尽可能在每个循环中创建一个新的 emailContent
变量。
正如 Andreas 所建议的,在有疑问时使用分析器。