【发布时间】: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。
【问题讨论】:
-
是的,避免使用
Promiseconstructor 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