Javascript-部分应用程序的参数之间的依赖关系



简介

我已经在我的模块中创建了给定的部分应用程序:

// GENERIC
const sendEmail = (subject, template) =>
async (to, ...props) => {
const mailsRef = firestore.collection("mails");
const html = template(...props);
const mail = {
to,
message: {
subject,
html,
},
};
await mailsRef.add(mail);
functions.logger.log("Email queued for delivery!");
};
// SPECIFIC
const sendUpdatePasswordEmail = sendEmail(
"Your password has been updated.",
updatePasswordHTMLTemplate
);
const sendSignUpWelcomeEmail = sendEmail(
"Welcome to Binance!",
signUpWelcomeHTMLTemplate
);
const sendBitcoinAddressUpdatedEmail = sendEmail(
"Your bitcoin address has been updated.",
bitcoinWalletAddressHTMLTemplate
);

如您所见,我的sendUpdatePasswordEmail将主题和HTML模板生成器传递给sendEmail函数。

这就是我的updatePasswordHTMLTemplate的样子:

const updatePasswordHTMLTemplate = (language) => `
<!DOCTYPE html>
<html lang="${language}">
...
<body>
<h1>${t("auth.password.update.title", language)}</h1>
</body>
</html>
`;

正如你所看到的,我正在使用某种i18n将我发送给最终用户的电子邮件国际化。

问题

我遇到的问题是,我需要一种方法将用户的语言作为参数传递给我的sendUpdatePasswordEmail函数。而且,我还需要翻译电子邮件的主题:

const sendUpdatePasswordEmail = sendEmail(
"Your password has been updated.", <--- t("auth.password.update.subject", language)
updatePasswordHTMLTemplate
);

这里有我应该使用的设计模式吗?我的意思是,正如你所看到的,我使用部分应用程序是为了";泛化";我的代码,使其可读性更强,但大问题来自主题翻译。。。

这是我使用我描述的方法的方式:

const { email, language } = context.auth.token;
await sendUpdatePasswordEmail(email); // I need to pass the language!

有什么想法吗?非常感谢。


我想做一些类似的事情:

const sendUpdatePasswordEmail = (language) => sendEmail(
t("subject.scope", language), 
updatePasswordTemplate,
language
);

但是,我必须使用以下方法:

sendUpdatePasswordEmail(language)(emailAddress);

我不喜欢这样(不是一种干净的方式)。

我建议简单地将subject参数作为一个接受语言的函数,就像您的template参数已经是:

const makeSendEmail = (subjectTemplate, bodyTemplate) => async (to, ...props) => {
const mailsRef = firestore.collection("mails");
const subject = subjectTemplate(...props);
const html = bodyTemplate(...props);
const mail = {…};
…
};

然后使用

const sendUpdatePasswordEmail = makeSendEmail(
(language) => t("subject.scope", language), 
updatePasswordTemplate
);

并呼叫

sendUpdatePasswordEmail(emailAddress, language);

与之前一样

最新更新