如何避免在刷新存储在 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 所建议的,在有疑问时使用分析器。