【问题标题】:nodemailer delay when not returning a promise不返回承诺时的nodemailer延迟
【发布时间】:2020-10-10 22:55:18
【问题描述】:

我在 Firebase 中有一个云函数,它在一连串的 Promise 调用中以调用此函数结束:

function sendEmail() {
  return new Promise((accept) => {
    const Email = require('email-templates');
    const email = new Email({...});
    email.send({...}).then(() => {
      console.log('Email sent');
    }).catch((e) => {
      console.error(e);
    });
    accept();
  });
}

我很清楚 email.send() 返回一个承诺这一事实。但是这种方法存在一个问题,也就是说,如果我要将函数更改为: p>

function sendEmail() {
    const Email = require('email-templates');
    const email = new Email({...});
    return email.send({...});
}

这通常会导致 UI 挂起很长一段时间(10 多秒),因为从承诺到解决所需的时间等于发送电子邮件所需的时间。

这就是为什么我认为第一种方法会更好。只需异步调用 email.send() ,它最终会发送邮件,无论邮件是否完成往返,都会向客户端返回响应。

第一种方法是给我带来问题。云功能必须更快地完成执行,从而最终为用户提供更好的体验,但是,电子邮件不会再发送 15 分钟以上。

我正在考虑另一种方法,我们有一个单独的云函数挂钩来处理电子邮件发送,但我想先询问 StackOverflow。

【问题讨论】:

  • 是的,避免使用Promise constructor antipattern。如果你想要just fire off the async function and not wait for it,你的函数根本不应该返回一个承诺。
  • 电子邮件在 15 分钟内没有发送。” - 这对我来说真的没有意义。我怀疑它是由这段代码的变化引起的。
  • Bergi,因此我的问题是,当我返回 email.send() 时,电子邮件会在 10 秒后发送,一切都很好。当我使用 Promise 构造函数反模式时,结果是一封长时间不发送的电子邮件......我发誓我没有撒谎! ;)
  • 我注意到这是一个类似的问题:stackoverflow.com/questions/63581753/…
  • 请编辑问题以显示出现问题的完整、最小功能。您永远不应忽略 Cloud Functions 中的 Promise,我们需要了解您如何在上下文中使用此函数。

标签: javascript firebase promise google-cloud-functions nodemailer


【解决方案1】:

我认为这里混合了两个方面。

问题的一方面涉及云函数上下文中的承诺。 Cloud Functions 中的 Promise 需要在调用 res.send() 之前解决,因为在此调用之后,该函数将立即关闭,并且无法保证未解决的 Promise 将在函数实例终止之前完成,请参阅此 question。您最好永远不要调用res.send(),而是返回如Firebase documentation 中所示的promise 的结果,这里的关键是确保promise 得到正确解析,例如使用return myPromise().then(console.log); 之类的成语,这将强制承诺决议。

另外,正如 Bergi 在 cmets 中指出的那样,第一个 sn-p 使用带有 promise 的反模式,而第二个更简洁明了。如果您在 UI 中遇到延迟,则执行可能会在等待 Function 响应时被冻结,您可能会考虑在您的特定用例中是否可以避免这种情况。

话虽如此,您创建一个单独的函数来处理电子邮件发送过程的最后一个想法也可能会减少响应时间,甚至从关注点分离的角度来看可能更有意义。要走这条路,我建议从主功能发送一条 PubSub 消息,以便第二条发送电子邮件。此外,PubSub triggered 功能允许配置retry policies,这可能有助于确保在最终错误的情况下发送邮件。上面链接的问题也建议使用这种方法。

【讨论】:

    猜你喜欢
    • 2017-11-24
    • 2015-03-08
    • 2018-06-05
    • 1970-01-01
    • 2015-03-27
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多